
#Область ОписаниеПеременных

&НаКлиенте
Перем мТипХЗ;

&НаКлиенте
Перем мТипUUID;

&НаКлиенте
Перем мПоследнийUUID;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ПутьКФормам = вПолучитьОбработку().Метаданные().ПолноеИмя() + ".Форма.";

	_ПрефиксДляНовыхЭлементов = "__XXX__";
	_ТипОбъекта = "";
	_ПриЗаполненииОбрабатыватьТолькоВыделенныеСтроки = Истина;
	_КонфигурацияДопускаетДопДвижения = (Метаданные.Документы.Найти("РегистраторРасчетов") <> Неопределено);
	мОбъектСсылкаПредыдущий = Неопределено;

	Элементы.СтрДвиженияДокумента.Видимость = Ложь;
	Элементы._ОткрытьРедакторДвиженийДоп.Видимость = Ложь;

	Если Не УИ_Пользователи.ЭтоПолноправныйПользователь() Тогда
		Элементы.Форма_УдалитьОбъект.Видимость = Ложь;
	КонецЕсли;

	Если Параметры.Свойство("ДанныеОтладки") Тогда
		ДанныеДляОтладки = ПолучитьИзВременногоХранилища(Параметры.ДанныеОтладки);
		мОбъектСсылка = ДанныеДляОтладки.Объект;	
	ИначеЕсли Параметры.Свойство("мОбъектСсылка") Тогда
		мОбъектСсылка = Параметры.мОбъектСсылка;
	КонецЕсли;

	УИ_РаботаСФормами.ФормаПриСозданииНаСервереСоздатьРеквизитыПараметровЗаписи(ЭтотОбъект,
		Элементы.ГруппаПараметрыЗаписи);
	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	мТипХЗ = Тип("ХранилищеЗначения");
	мТипUUID = Тип("УникальныйИдентификатор");

	ОбновитьДанныеОбъекта(Неопределено);
КонецПроцедуры

&НаСервере
Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки)
//	Если Настройки["_ДополнительныеСвойства"] = Неопределено Тогда
//		_ДополнительныеСвойства.Очистить();
//	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	//Если ЗначениеЗаполнено(мОбъектСсылка) Тогда
	Если мОбъектСсылка <> Неопределено Тогда
		вОбновитьДанныеОбъекта();
	КонецЕсли;
КонецПроцедуры




#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура мОбъектСсылкаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ДоступныеНаборыТипов = УИ_ОбщегоНазначенияКлиентСервер.ДоступныеНаборыТиповДляРедактирования();
	
	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения(ЭтотОбъект,
																										  Элемент,
																										  "мОбъектСсылка");
	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.Значение = мОбъектСсылка;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ЭтотОбъект;
	ПараметрыОбработчика.НаборТипов = ДоступныеНаборыТипов.Ссылки;
	ПараметрыОбработчика.ОповещениеОЗавершении = Новый ОписаниеОповещения("мОбъектСсылкаНачалоВыбораЗавершениеВыбораЗначения",
		ЭтотОбъект);

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикНачалоВыбораЗначения(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура мОбъектСсылкаОчистка(Элемент, СтандартнаяОбработка)
	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияОчистка(ЭтотОбъект,
																							 Элемент,
																							 "мОбъектСсылка");
	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ЭтотОбъект;

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикОчистка(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура мОбъектСсылкаПриИзменении(Элемент)
	ПриИзмененииМСсылки();
КонецПроцедуры

&НаКлиенте
Процедура _URLПриИзменении(Элемент)
	Если Не ПустаяСтрока(_URL) Тогда
		НайтиОбъектПоURL(Неопределено);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура _ИмяНабораЗаписейПриИзменении(Элемент)
	вОбновитьНаборЗаписей();
КонецПроцедуры

&НаКлиенте
Процедура _ЗначениеДляЗаполненияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ПараметрыОбработкиСобытия = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения(ЭтотОбъект,
																											   Элемент,
																											   "_ЗначениеДляЗаполнения");
																											   
	ПараметрыОбработкиСобытия.ДоступенКонтейнер = Ложь;																											   
	ПараметрыОбработкиСобытия.Значение = _ЗначениеДляЗаполнения;
	ПараметрыОбработкиСобытия.СтруктураХраненияЗначения = ЭтотОбъект;
	
	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикНачалоВыбораЗначения(ПараметрыОбработкиСобытия, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура _ЗначениеДляЗаполненияОчистка(Элемент, СтандартнаяОбработка)
	ПараметрыОбработкиСобытия = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияОчистка(ЭтотОбъект,
																								  Элемент,
																								  "_ЗначениеДляЗаполнения");

	ПараметрыОбработкиСобытия.ДоступенКонтейнер = Ложь;																											   
	ПараметрыОбработкиСобытия.СтруктураХраненияЗначения = ЭтотОбъект;

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикОчистка(ПараметрыОбработкиСобытия, СтандартнаяОбработка);
КонецПроцедуры


#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыРеквизитыОбъекта

&НаКлиенте
Процедура РеквизитыОбъектаЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТекДанные = Элементы.РеквизитыОбъекта.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения(ЭтотОбъект,
																										  Элемент,
																										  "Значение");

	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ТекДанные;
	ПараметрыОбработчика.Значение = ТекДанные.Значение;
	ПараметрыОбработчика.ТекущееОписаниеТиповЗначения = ТекДанные.ТипЗначения;
	
	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикНачалоВыбораЗначения(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура РеквизитыОбъектаЗначениеОчистка(Элемент, СтандартнаяОбработка)
	ТекДанные = Элементы.РеквизитыОбъекта.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияОчистка(ЭтотОбъект,
																							 Элемент,
																							 "Значение");

	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ТекДанные;
	ПараметрыОбработчика.ТекущееОписаниеТиповЗначения = ТекДанные.ТипЗначения;

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикОчистка(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры


#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыТабличнаяЧасть

&НаКлиенте
Процедура Подключаемый_ТабличнаяЧастьПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	Если ОтменаРедактирования Тогда
		Возврат;
	КонецЕсли;
	
	ОбновитьЗаголовокСтраницыТабличнойЧасти(Элемент);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ТабличнаяЧастьПослеУдаления(Элемент)
	ОбновитьЗаголовокСтраницыТабличнойЧасти(Элемент);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ТабличнаяЧастьРеквизитНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТаблицаФормыЭлемента = Элемент.Родитель;
		
	ТекДанные = ТаблицаФормыЭлемента.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		ВозвраТ;
	КонецЕсли;
	ИмяКолонки = Сред(Элемент.Имя, СтрДлина(ТаблицаФормыЭлемента.Имя) + 1);
	

	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения(ЭтотОбъект,
																										  Элемент,
																										  ИмяКолонки);

	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ТекДанные;
	ПараметрыОбработчика.Значение = ТекДанные[ИмяКолонки];
	ПараметрыОбработчика.ТекущееОписаниеТиповЗначения = Элемент.ДоступныеТипы;
	
	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикНачалоВыбораЗначения(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ТабличнаяЧастьРеквизитОчистка(Элемент, СтандартнаяОбработка)
	ТаблицаФормыЭлемента = Элемент.Родитель;
		
	ТекДанные = ТаблицаФормыЭлемента.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		ВозвраТ;
	КонецЕсли;
	ИмяКолонки = Сред(Элемент.Имя, СтрДлина(ТаблицаФормыЭлемента.Имя) + 1);

	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияОчистка(ЭтотОбъект,
																							 Элемент,
																							 ИмяКолонки);

	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ТекДанные;
	ПараметрыОбработчика.ТекущееОписаниеТиповЗначения = Элемент.ДоступныеТипы;

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикОчистка(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормы_НаборЗаписей

&НаКлиенте
Процедура Подключаемый_НаборЗаписейРеквизитНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ТаблицаФормыЭлемента = Элементы._НаборЗаписей;
		
	ТекДанные = ТаблицаФормыЭлемента.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		ВозвраТ;
	КонецЕсли;
	ИмяКолонки = Сред(Элемент.Имя, СтрДлина(ТаблицаФормыЭлемента.Имя) + 2);
	

	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения(ЭтотОбъект,
																										  Элемент,
																										  ИмяКолонки);

	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ТекДанные;
	ПараметрыОбработчика.Значение = ТекДанные[ИмяКолонки];
	ПараметрыОбработчика.ТекущееОписаниеТиповЗначения = Элемент.ДоступныеТипы;
	
	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикНачалоВыбораЗначения(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_НаборЗаписейРеквизитОчистка(Элемент, СтандартнаяОбработка)
	ТаблицаФормыЭлемента = Элементы._НаборЗаписей;
		
	ТекДанные = ТаблицаФормыЭлемента.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		ВозвраТ;
	КонецЕсли;
	ИмяКолонки = Сред(Элемент.Имя, СтрДлина(ТаблицаФормыЭлемента.Имя) + 2);

	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияОчистка(ЭтотОбъект,
																							 Элемент,
																							 ИмяКолонки);

	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.СтруктураХраненияЗначения = ТекДанные;
	ПараметрыОбработчика.ТекущееОписаниеТиповЗначения = Элемент.ДоступныеТипы;

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикОчистка(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры



#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура _ВыбратьУдаленныйОбъект(Команда)
	ПоказатьВводСтроки(Новый ОписаниеОповещения("вОбработатьВводСтроки_ОбъектНеНайден", ЭтаФорма), ,
		"Введите битую ссылку: <Объект не найден> ... ", , Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанныеОбъекта(Команда)
	вОбновитьДанныеОбъекта();
КонецПроцедуры

&НаКлиенте
Процедура _ЗаполнитьПоОбразцу(Команда)
	Если мОбъектСсылка = Неопределено Тогда
		ПоказатьПредупреждение( , "Не задан объект для обработки!", 20);
		Возврат;
	КонецЕсли;

	пПолноеИмя = вПолучитьПолноеИмяМД(мОбъектСсылка);
	ОткрытьФорму(пПолноеИмя + ".ФормаВыбора", , , , , ,
		Новый ОписаниеОповещения("вОбработатьВыборОбразцаДляЗаполнения", ЭтаФорма),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьОбъект(Команда)
	Если Не ЗначениеЗаполнено(мОбъектСсылка) Тогда
		ПоказатьПредупреждение( , "Не задан объект для записи!", 20);
		Возврат;
	КонецЕсли;
	ПоказатьВопрос(Новый ОписаниеОповещения("ЗаписатьОбъектДалее", ЭтаФорма),
		"Объект будет записан в базу. Продолжить?", РежимДиалогаВопрос.ДаНетОтмена, 20);
КонецПроцедуры

&НаКлиенте
Процедура _ЗаписатьОбъектКакНовый(Команда)
	Если мОбъектСсылка = Неопределено Тогда
		ПоказатьПредупреждение( , "Не заданы данные объекта для записи!", 20);
		Возврат;
	КонецЕсли;
	ПоказатьВопрос(Новый ОписаниеОповещения("ЗаписатьОбъектКакНовыйДалее", ЭтаФорма),
		"В базу будет записан новый объект. Продолжить?", РежимДиалогаВопрос.ДаНетОтмена, 20);
КонецПроцедуры

&НаКлиенте
Процедура _ЗаписатьОбъектКакНовыйСУказаннымUUID(Команда)
	Если мОбъектСсылка = Неопределено Тогда
		ПоказатьПредупреждение( , "Не заданы данные объекта для записи!", 20);
		Возврат;
	ИначеЕсли ПустаяСтрока(_UUID) Тогда
		ПоказатьПредупреждение( , "Не задан UUID для нового объекта!", 20);
		Возврат;
	КонецЕсли;

	пТекст = "В базу будет записан новый объект с заданным UUID.
			 |UUID: " + _UUID + "
								|
								|Продолжить?";
	ПоказатьВопрос(Новый ОписаниеОповещения("ЗаписатьОбъектКакНовыйДалее", ЭтаФорма, _UUID), пТекст,
		РежимДиалогаВопрос.ДаНетОтмена, 20);
КонецПроцедуры

&НаКлиенте
Процедура _УдалитьОбъект(Команда)
	Если Не ЗначениеЗаполнено(мОбъектСсылка) Тогда
		ПоказатьПредупреждение( , "Не задан объект для удаления!", 20);
		Возврат;
	КонецЕсли;
	ТекстВопроса = "Объект будет удален из базы!
				   |Никакие проверки производиться не будут (возможно появление битых ссылок)!
				   |
				   |Продолжить?";
	ПоказатьВопрос(Новый ОписаниеОповещения("УдалитьОбъектДалее", ЭтаФорма), ТекстВопроса,
		РежимДиалогаВопрос.ДаНетОтмена, 20);
КонецПроцедуры

&НаКлиенте
Процедура _ПереключитьАктивностьЗаписей(Команда)
	Для Каждого Стр Из _НаборЗаписей Цикл
		Стр.Активность = Не Стр.Активность;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура _ОбновитьНаборЗаписей(Команда)
	вОбновитьНаборЗаписей();
КонецПроцедуры

&НаКлиенте
Процедура _ЗаписатьНаборЗаписей(Команда)
	Если Не ЗначениеЗаполнено(мОбъектСсылка) Тогда
		ПоказатьПредупреждение( , "Не задан объект для записи движений", 20);
		Возврат;
	КонецЕсли;
	Если ПустаяСтрока(_ИмяНабораЗаписей) Тогда
		ПоказатьПредупреждение( , "Не задан набор записей для сохранения", 20);
		Возврат;
	КонецЕсли;
	ПоказатьВопрос(Новый ОписаниеОповещения("_ЗаписатьНаборЗаписейДалее", ЭтаФорма),
		"Набор записей будет записан в базу. Продолжить?", РежимДиалогаВопрос.ДаНетОтмена, 20);
КонецПроцедуры

&НаКлиенте
Процедура _ПоказатьВсеДвижения(Команда)
	Если ЗначениеЗаполнено(мОбъектСсылка) Тогда
		СписокРегистров = Элементы._ИмяНабораЗаписей.СписокВыбора.Скопировать();
		Если СписокРегистров.Количество() <> 0 Тогда
			ТДок = вСформироватьОтчетПоДвижениям(мОбъектСсылка, СписокРегистров, _КонфигурацияДопускаетДопДвижения);
			ТДок.Показать("Наличие движений");
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура НайтиОбъектПоUUID(Команда)
	НайтиОбъектПоUUIDСервер();
КонецПроцедуры

&НаКлиенте
Процедура НайтиОбъектПоТипу_UUID(Команда)
	НайтиОбъектПоТипу_UUIDСервер();
КонецПроцедуры

&НаКлиенте
Процедура НайтиОбъектПоURL(Команда)
	Значение = вНайтиОбъектПоURL(_URL);

	Если мОбъектСсылка <> Значение Тогда
		мОбъектСсылка = Значение;
		ОбновитьДанныеОбъекта(Неопределено);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура _ОткрытьФормуСписка(Команда)
	Если мОбъектСсылка <> Неопределено Тогда
		пПолноеИмя = вПолучитьПолноеИмяМД(мОбъектСсылка);
		УИ_ОбщегоНазначенияКлиент.ОткрытьДинамическийСписок(пПолноеИмя);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьОбъект(Команда)
	Значение = Неопределено;

	ЭФ = ЭтаФорма.ТекущийЭлемент;

	Имя = вПолучитьПутьКДаннымТекущегоЭлемента();
	Если Не ЗначениеЗаполнено(Имя) Тогда
		Возврат;
	КонецЕсли;

	Если ТипЗнч(ЭФ) = Тип("ПолеФормы") Тогда
		Значение = ЭтаФорма[Имя];
	ИначеЕсли ТипЗнч(ЭФ) = Тип("ТаблицаФормы") Тогда
		ТекДанные = ЭФ.ТекущиеДанные;
		Если ТекДанные <> Неопределено Тогда
			Если ЭФ.Имя = "РеквизитыОбъекта" Тогда
				Значение = ТекДанные.Значение;
			Иначе
				Значение = ТекДанные[Имя];
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

	Если ЗначениеЗаполнено(Значение) Тогда
		Если ТипЗнч(Значение) = мТипХЗ Тогда
			вПоказатьЗначениеХЗ(Значение);

		ИначеЕсли вЭтоОбъектМетаданных(ТипЗнч(Значение)) Тогда
			УИ_ОбщегоНазначенияКлиент.РедактироватьОбъект(Значение);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура _ПоказатьТипЗначения(Команда)
	_ТипЗначенияТекущегоПоля = "";

	Значение = Неопределено;

	ЭФ = ЭтаФорма.ТекущийЭлемент;

	Имя = вПолучитьПутьКДаннымТекущегоЭлемента();
	Если Не ЗначениеЗаполнено(Имя) Тогда
		Возврат;
	КонецЕсли;

	Если ТипЗнч(ЭФ) = Тип("ПолеФормы") Тогда
		Значение = ЭтаФорма[Имя];
	ИначеЕсли ТипЗнч(ЭФ) = Тип("ТаблицаФормы") Тогда
		ТекДанные = ЭФ.ТекущиеДанные;
		Если ТекДанные <> Неопределено Тогда
			Если ЭФ.Имя = "РеквизитыОбъекта" Тогда
				Значение = ТекДанные.Значение;
			Иначе
				Значение = ТекДанные[Имя];
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

	Если Значение = Неопределено Тогда
		ИмяТипа = "Неопределено";
	Иначе
		ИмяТипа = вСформироватьИмяТипаПоЗначению(Значение);
	КонецЕсли;

	_ТипЗначенияТекущегоПоля = ИмяТипа;
КонецПроцедуры

&НаКлиенте
Процедура _ОткрытьРедакторДвижений(Команда)
	СтрукПарам = Новый Структура("ПутьКФормам, мОбъектСсылка", ПутьКФормам, мОбъектСсылка);
	Попытка
		ОткрытьФорму("Обработка.УИ_РедакторРеквизитовОбъекта.Форма.ФормаРедакторДвижений", СтрукПарам, , мОбъектСсылка);
	Исключение
		Сообщить("Не найдена форма ""ФормаРедакторДвижений""!");
	КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура _ОткрытьРедакторДвиженийДоп(Команда)
	СтрукПарам = Новый Структура("ПутьКФормам, мОбъектСсылка", ПутьКФормам, мОбъектСсылка);
	Попытка
		ОткрытьФорму("Обработка.УИ_РедакторРеквизитовОбъекта.Форма.ФормаРедакторДвиженийДоп", СтрукПарам, ,
			мОбъектСсылка);
	Исключение
		Сообщить("Не найдена форма ""ФормаРедакторДвижений""!");
	КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура _ЗаполнитьДанныеТекущейКолонки(Команда)
	ТекСтраница = Элементы.ГруппаСтраницы.ТекущаяСтраница;
	Если ТекСтраница.Имя = "СтрРеквизитыОбъекта" Или ТекСтраница.Имя = "СтрНастройки" Тогда
		Возврат;
	КонецЕсли;

	ТекТаб = Неопределено;
	Для Каждого Элем Из ТекСтраница.ПодчиненныеЭлементы Цикл
		Если ТипЗнч(Элем) = Тип("ТаблицаФормы") Тогда
			ТекТаб = Элем;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	пЗначение = _ЗначениеДляЗаполнения;

	Если ТекТаб <> Неопределено Тогда
		СтрукДанные = вПолучитьСвойстваТабличногоПоля(ТекТаб.Имя);
		Если Не СтрукДанные.Отказ Тогда
			пТаблица = ЭтаФорма[СтрукДанные.Таблица];
			пПоле = СтрукДанные.Поле;

			Если пТаблица.Количество() <> 0 Тогда

				Если _ПриЗаполненииОбрабатыватьТолькоВыделенныеСтроки Тогда
					Для Каждого Элем Из ТекТаб.ВыделенныеСтроки Цикл
						Стр = пТаблица.НайтиПоИдентификатору(Элем);
						Стр[пПоле] = пЗначение;
					КонецЦикла;
				Иначе
					Для Каждого Стр Из пТаблица Цикл
						Стр[пПоле] = пЗначение;
					КонецЦикла;
				КонецЕсли;

			КонецЕсли;

		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

// для документов
&НаКлиенте
Процедура _ПровестиДокумент(Команда)
	Если Не ЗначениеЗаполнено(мОбъектСсылка) Тогда
		ПоказатьПредупреждение( , "Не задан документ для обработки", 20);
		Возврат;
	КонецЕсли;

	Если Не _ПроведениеРазрешено Тогда
		ПоказатьПредупреждение( , "Проведение документов данного типа запрещено!", 20);
		Возврат;
	КонецЕсли;

	ПоказатьВопрос(Новый ОписаниеОповещения("вПровестиДокументДалее", ЭтаФорма),
		"Документ будет перепроведен. Продолжить?", РежимДиалогаВопрос.ДаНетОтмена, 20);
КонецПроцедуры

&НаКлиенте
Процедура _РаспровестиДокумент(Команда)
	Если Не ЗначениеЗаполнено(мОбъектСсылка) Тогда
		ПоказатьПредупреждение( , "Не задан документ для обработки", 20);
		Возврат;
	КонецЕсли;

	Если Не _ПроведениеРазрешено Тогда
		ПоказатьПредупреждение( , "Проведение документов данного типа запрещено!", 20);
		Возврат;
	КонецЕсли;

	ПоказатьВопрос(Новый ОписаниеОповещения("вРаспровестиДокументДалее", ЭтаФорма),
		"Для документа будет выполнена отмена проведения. Продолжить?", РежимДиалогаВопрос.ДаНетОтмена, 20);
КонецПроцедуры

&НаКлиенте
Процедура _ВыгрузитьНаборЗаписей(Команда)
	Если Не ЗначениеЗаполнено(мОбъектСсылка) Тогда
		ПоказатьПредупреждение( , "Не задан объект для выгрузки движений", 20);
		Возврат;
	КонецЕсли;
	Если ПустаяСтрока(_ИмяНабораЗаписей) Тогда
		ПоказатьПредупреждение( , "Не задан набор записей для выгрузки", 20);
		Возврат;
	КонецЕсли;

	вВыгрузитьОбъект(4);
КонецПроцедуры

&НаКлиенте
Процедура _ВыгрузитьОбъект(Команда)
	вВыгрузитьОбъект(1);
КонецПроцедуры

&НаКлиенте
Процедура _ВыгрузитьОбъектСДвижениями(Команда)
	вВыгрузитьОбъект(2);
КонецПроцедуры

&НаКлиенте
Процедура _ВыгрузитьДвиженияОбъекта(Команда)
	вВыгрузитьОбъект(3);
КонецПроцедуры

&НаКлиенте
Процедура _ЗагрузитьДанныеXML(Команда)
	Диалог = вПолучитьДиалогВыбораФайлаXML(Истина);
	Диалог.Показать(Новый ОписаниеОповещения("вЗагрузитьДанныеИзФайла", ЭтаФорма));
КонецПроцедуры

&НаКлиенте
Процедура _ВставитьУникальныйИдентификатор(Команда)
	ТекТаблица = ЭтаФорма.ТекущийЭлемент;

	Если ТекТаблица.Имя = "_ЗначениеДляЗаполнения" Тогда
		пСтрук = Новый Структура("Таблица", ТекТаблица.Имя);
		ПоказатьВводСтроки(Новый ОписаниеОповещения("вОбработатьВвод_UUID", ЭтаФорма, пСтрук), мПоследнийUUID,
			"Введите уникальный идентификатор", , Ложь);
		Возврат;
	ИначеЕсли ТипЗнч(ТекТаблица) <> Тип("ТаблицаФормы") Тогда
		Возврат;
	КонецЕсли;

	ТекКолонка = ТекТаблица.ТекущийЭлемент;
	Если ТекКолонка = Неопределено Или ТекКолонка.ТолькоПросмотр Тогда
		Возврат;
	КонецЕсли;

	Попытка
		пДоступныеТипы = ТекКолонка.ДоступныеТипы.Типы();
		Если пДоступныеТипы.Количество() <> 0 И пДоступныеТипы.Найти(Тип("УникальныйИдентификатор")) <> 0 Тогда
			Возврат;
		КонецЕсли;
	Исключение
	КонецПопытки;

	ТекДанные = Элементы[ТекТаблица.Имя].ТекущиеДанные;
	Если ТекДанные <> Неопределено Тогда
		пСтрук = Новый Структура("Таблица", ТекТаблица.Имя);

		Если ТекТаблица.Имя = "РеквизитыОбъекта" Тогда
			пСтрук.Вставить("Поле", "Значение");
//		ИначеЕсли ТекТаблица.Имя = "_ДополнительныеСвойства" Тогда
//			пСтрук.Вставить("Поле", "Значение");
		Иначе
			пСтрук.Вставить("Поле", Сред(ТекКолонка.Имя, СтрДлина(ТекТаблица.Имя) + 1));
		КонецЕсли;

		ПоказатьВводСтроки(Новый ОписаниеОповещения("вОбработатьВвод_UUID", ЭтаФорма, пСтрук), мПоследнийUUID,
			"Введите уникальный идентификатор", , Ложь);
	КонецЕсли;
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_НастроитьПараметрыЗаписи(Команда)
	УИ_ОбщегоНазначенияКлиент.РедактироватьПараметрыЗаписи(ЭтотОбъект);
КонецПроцедуры


#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Функция вПолучитьОбработку()
	Возврат РеквизитФормыВЗначение("Объект");
КонецФункции

&НаКлиенте
Процедура мОбъектСсылкаНачалоВыбораЗавершениеВыбораЗначения(Результат, ДополнительныеПараметры) Экспорт
	мОбъектСсылка = Результат;
	ПриИзмененииМСсылки();
КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииМСсылки()
	ЭтаФорма.КлючУникальности = мОбъектСсылка;

	_URL = "";

	Если мОбъектСсылка <> Неопределено Тогда
		_UUID = "";
	КонецЕсли;

	ОбновитьДанныеОбъекта(Неопределено);
КонецПроцедуры

&НаКлиенте
Процедура вОбработатьВводСтроки_ОбъектНеНайден(Строка, ДопПарам = Неопределено) Экспорт
	Если Строка <> Неопределено И Не ПустаяСтрока(Строка) Тогда
		пСтрук = вПолучитьСсылкуНаУдаленныйОбъект(Строка);
		Если Не пСтрук.Отказ Тогда
			мОбъектСсылка = пСтрук.Ссылка;
			ОбновитьДанныеОбъекта(Неопределено);
		ИначеЕсли Не ПустаяСтрока(пСтрук.ПричинаОтказа) Тогда
			Сообщить(пСтрук.ПричинаОтказа);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вОбработатьВыборОбразцаДляЗаполнения(РезультатЗакрытия, ДопПарам = Неопределено) Экспорт
	Если РезультатЗакрытия <> Неопределено Тогда
		пОбъектСсылка = мОбъектСсылка;
		мОбъектСсылка = РезультатЗакрытия;

		Попытка
			вОбновитьДанныеОбъекта();
		Исключение
		КонецПопытки;

		мОбъектСсылка = пОбъектСсылка;
		_UUID = мОбъектСсылка.УникальныйИдентификатор();
		_URL  = вПолучитьНавигационнуюСсылку(мОбъектСсылка);
	КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьОбъектДалее(РезультатВопроса, ДопПараметры) Экспорт
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		Если вЗаписатьОбъект(Ложь) Тогда
			ОтобразитьИзменениеДанных(мОбъектСсылка, ВидИзмененияДанных.Изменение);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьОбъектКакНовыйДалее(РезультатВопроса, ДопПараметры = Неопределено) Экспорт
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		Если вЗаписатьОбъект(Истина, ДопПараметры) Тогда
			ОтобразитьИзменениеДанных(мОбъектСсылка, ВидИзмененияДанных.Добавление);
			Если ДопПараметры <> Неопределено Тогда
				ОтобразитьИзменениеДанных(мОбъектСсылка, ВидИзмененияДанных.Изменение);
				//ПоказатьПредупреждение(,"Объект успешно записан!
				//|Для отображения новой ссылки необходимо перевыбрать объект.", 20);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьОбъектДалее(РезультатВопроса, ДопПараметры) Экспорт
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		пМассив = Новый Массив;
		пМассив.Добавить(ТипЗнч(мОбъектСсылка));
		пОписаниеТипов = Новый ОписаниеТипов(пМассив);

		Если вУдалитьОбъектНаСервере(мОбъектСсылка) Тогда
			ОтобразитьИзменениеДанных(мОбъектСсылка, ВидИзмененияДанных.Удаление);
			мОбъектСсылка = пОписаниеТипов.ПривестиЗначение();
			ОбновитьДанныеОбъекта(Неопределено);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура _ЗаписатьНаборЗаписейДалее(РезультатВопроса, ДопПараметры) Экспорт
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		вЗаписатьНаборЗаписей();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вПоказатьЗначениеХЗ(Значение)
	СтрукПарам = Новый Структура("ПутьКФормам, ДанныеХЗ", ПутьКФормам, Значение);
	ОткрытьФорму("ОбщаяФорма.УИ_ФормаХранилищаЗначения", СтрукПарам, , ТекущаяДата());
КонецПроцедуры
&НаСервере
Функция вПолучитьПутьКДаннымТекущегоЭлемента()
	ЭФ = ЭтаФорма.ТекущийЭлемент;

	Если ТипЗнч(ЭФ) = Тип("ТаблицаФормы") Тогда
		ТекПоле = ЭФ.ТекущийЭлемент;
		Если ТипЗнч(ТекПоле) = Тип("ПолеФормы") Тогда
			Значение = ТекПоле.ПутьКДанным;
			Поз = Найти(Значение, ".");
			Если Поз <> 0 Тогда
				Значение = Сред(Значение, Поз + 1);
				Если Найти(Значение, ".") = 0 Тогда
					Возврат Значение;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	ИначеЕсли ТипЗнч(ЭФ) = Тип("ПолеФормы") Тогда
		Возврат ЭФ.ПутьКДанным;
	КонецЕсли;

	Возврат "";
КонецФункции

&НаСервере
Функция вПолучитьСвойстваТабличногоПоля(Знач ИмяЭФ)
	пРезультат = Новый Структура("Отказ, Таблица, Поле", Истина, "", "");

	ЭФ = ЭтаФорма.Элементы[ИмяЭФ];

	Если ТипЗнч(ЭФ) = Тип("ТаблицаФормы") Тогда
		пРезультат.Вставить("Таблица", ЭФ.ПутьКДанным);

		ТекПоле = ЭФ.ТекущийЭлемент;
		Если ТипЗнч(ТекПоле) = Тип("ПолеФормы") Тогда
			Значение = ТекПоле.ПутьКДанным;
			Поз = Найти(Значение, ".");
			Если Поз <> 0 Тогда
				Значение = Сред(Значение, Поз + 1);
				пРезультат.Вставить("Поле", Значение);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;

	пРезультат.Отказ = (ПустаяСтрока(пРезультат.Таблица) Или ПустаяСтрока(пРезультат.Поле));

	Возврат пРезультат;
КонецФункции

&НаСервереБезКонтекста
Функция вСформироватьИмяТипаПоЗначению(Знач Значение)
	пТип = ТипЗнч(Значение);

	ОбъектМД = Метаданные.НайтиПоТипу(пТип);
	Если ОбъектМД <> Неопределено Тогда
		ИмяТипа = ОбъектМД.ПолноеИмя();
	Иначе
		ИмяТипа = Строка(пТип);
	КонецЕсли;

	Возврат ИмяТипа;
КонецФункции

&НаСервереБезКонтекста
Функция вЭтоОбъектМетаданных(Знач Тип)
	ОбъектМД = Метаданные.НайтиПоТипу(Тип);
	Возврат (ОбъектМД <> Неопределено И Не Метаданные.Перечисления.Содержит(ОбъектМД));
КонецФункции

&НаСервереБезКонтекста
Функция вПолучитьПолноеИмяМД(Ссыдка)
	Возврат Ссыдка.Метаданные().ПолноеИмя();
КонецФункции

&НаСервереБезКонтекста
Функция вНайтиОбъектПоURL(Знач URL)
	Поз1 = Найти(URL, "e1cib/data/");
	Поз2 = Найти(URL, "?ref=");

	Если Поз1 = 0 Или Поз2 = 0 Тогда
		Возврат Неопределено;
	КонецЕсли;

	Попытка
		ИмяТипа = Сред(URL, Поз1 + 11, Поз2 - Поз1 - 11);
		ШаблонЗначения = ЗначениеВСтрокуВнутр(ПредопределенноеЗначение(ИмяТипа + ".ПустаяСсылка"));
		ЗначениеСсылки = СтрЗаменить(ШаблонЗначения, "00000000000000000000000000000000", Сред(URL, Поз2 + 5));
		Ссылка = ЗначениеИзСтрокиВнутр(ЗначениеСсылки);
	Исключение
		Возврат Неопределено;
	КонецПопытки;

	Возврат Ссылка;
КонецФункции

&НаСервереБезКонтекста
Функция вПолучитьСсылкуНаУдаленныйОбъект(Знач пСтрокаОбъектНеНайден)
	пРезультат = Новый Структура("Отказ, ПричинаОтказа, Ссылка", Истина, "");
	пРезультат.ПричинаОтказа = "Неправильный формат строки!";

	Если ПустаяСтрока(пСтрокаОбъектНеНайден) Тогда
		пСтрокаОбъектНеНайден = "<Объект не найден> (769:b1390050568b35ac11e6e46fdd2c3861)";
	КонецЕсли;

	пСтрокаОбъектНеНайден = Сред(пСтрокаОбъектНеНайден, СтрНайти(пСтрокаОбъектНеНайден, "(") + 1);
	пСтрокаОбъектНеНайден = СтрЗаменить(пСтрокаОбъектНеНайден, ")", "");
	пСтрокаОбъектНеНайден = СокрЛП(пСтрокаОбъектНеНайден);

	Поз = СтрНайти(пСтрокаОбъектНеНайден, ":");

	пТип = Лев(пСтрокаОбъектНеНайден, Поз - 1);
	пСтрока = Сред(пСтрокаОбъектНеНайден, Поз + 1);

	Попытка
		пUUID = Сред(пСтрока, 25, 8) + "-" + Сред(пСтрока, 21, 4) + "-" + Сред(пСтрока, 17, 4) + "-" + Сред(пСтрока, 1,
			4) + "-" + Сред(пСтрока, 5, 12);
		пUUID = Новый УникальныйИдентификатор(пUUID);

		пСтрукОбъектыМД = Новый Структура("ПланыОбмена, Справочники, Документы, ПланыВидовРасчета, ПланыВидовХарактеристик, ПланыСчетов, БизнесПроцессы, Задачи");

		Для Каждого пРаздел Из пСтрукОбъектыМД Цикл
			Для Каждого Элем Из Метаданные[пРаздел.Ключ] Цикл
				пМенеджер = Вычислить(пРаздел.Ключ + "[Элем.Имя]");
				пСтрока = ЗначениеВСтрокуВнутр(пМенеджер.ПустаяСсылка());
				Поз1 = СтрНайти(пСтрока, ",", НаправлениеПоиска.СКонца);
				Поз2 = СтрНайти(пСтрока, ":");

				Если Сред(пСтрока, Поз1 + 1, Поз2 - Поз1 - 1) = пТип Тогда
					пРезультат.Ссылка = пМенеджер.ПолучитьСсылку(пUUID);
					пРезультат.Отказ = Ложь;

					Возврат пРезультат;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	Исключение
		пРезультат.ПричинаОтказа = пРезультат.ПричинаОтказа + Символы.ПС + КраткоеПредставлениеОшибки(
			ИнформацияОбОшибке());
		Возврат пРезультат;
	КонецПопытки;

	Возврат пРезультат;
КонецФункции
&НаСервере
Процедура НайтиОбъектПоUUIDСервер()
	Если Не ПустаяСтрока(_UUID) Тогда
		мОбъектСсылка = Неопределено;
		_ТипОбъекта = "";

		Попытка
			УИД = Новый УникальныйИдентификатор(_UUID);
		Исключение
			Сообщить("Неправильное значение UUID");
			Возврат;
		КонецПопытки;

		Если Не ЗначениеЗаполнено(УИД) Тогда
			Возврат;
		КонецЕсли;

		Струк = Новый Структура("Справочники, Документы, ПланыВидовРасчета, ПланыВидовХарактеристик, ПланыСчетов, БизнесПроцессы, Задачи");
		Для Каждого Элем Из Струк Цикл
			ОбъектыМенеджер = Вычислить(Элем.Ключ);
			Для Каждого Менеджер Из ОбъектыМенеджер Цикл
				Х = Менеджер.ПолучитьСсылку(УИД);
				Если Х.ПолучитьОбъект() <> Неопределено Тогда
					мОбъектСсылка = Х;
					_ТипОбъекта = мОбъектСсылка.Метаданные().ПолноеИмя();
					вОбновитьДанныеОбъекта();
					Возврат;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура НайтиОбъектПоТипу_UUIDСервер()
	Если Не ПустаяСтрока(_ТипОбъекта) И Не ПустаяСтрока(_UUID) Тогда
		Попытка
			УИД = Новый УникальныйИдентификатор(_UUID);
		Исключение
			Сообщить("Неправильное значение UUID");
			Возврат;
		КонецПопытки;

		ИмяТипа = СтрЗаменить(_ТипОбъекта, ".", "Ссылка.");
		Попытка
			мОбъектСсылка = XMLЗначение(Тип(ИмяТипа), _UUID);
			вОбновитьДанныеОбъекта();
		Исключение
		КонецПопытки;
	КонецЕсли;
КонецПроцедуры
&НаСервере
Функция вСоздатьНовыйОбъект(ОбъектМД)
	пИмя = ОбъектМД.Имя;

	Если Метаданные.Справочники.Содержит(ОбъектМД) Или Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМД) Тогда
		ЭтоИерархияГруппИЭлементов = вЭтоИерархияГруппИЭлементов(ОбъектМД);

		Если ЭтоИерархияГруппИЭлементов Тогда
			Массив = РеквизитыОбъекта.НайтиСтроки(Новый Структура("Имя", "ЭтоГруппа"));
			пЭтоГруппа = (Массив.Количество() = 1 И Массив[0].ЭтоГруппа = Истина);
		Иначе
			пЭтоГруппа = Ложь;
		КонецЕсли;

		Если Метаданные.Справочники.Содержит(ОбъектМД) Тогда
			Менеджер = Справочники;
		Иначе
			Менеджер = ПланыВидовХарактеристик;
		КонецЕсли;

		НовыйОбъект = ?(пЭтоГруппа, Менеджер[пИмя].СоздатьГруппу(), Менеджер[пИмя].СоздатьЭлемент());

	ИначеЕсли Метаданные.ПланыОбмена.Содержит(ОбъектМД) Тогда
		НовыйОбъект = ПланыОбмена[пИмя].СоздатьУзел();

	ИначеЕсли Метаданные.Документы.Содержит(ОбъектМД) Тогда
		НовыйОбъект = Документы[пИмя].СоздатьДокумент();

	ИначеЕсли Метаданные.ПланыСчетов.Содержит(ОбъектМД) Тогда
		НовыйОбъект = ПланыСчетов[пИмя].СоздатьСчет();

	ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(ОбъектМД) Тогда
		НовыйОбъект = ПланыВидовРасчета[пИмя].СоздатьВидРасчета();

	ИначеЕсли Метаданные.БизнесПроцессы.Содержит(ОбъектМД) Тогда
		НовыйОбъект = БизнесПроцессы[пИмя].СоздатьБизнесПроцесс();

	ИначеЕсли Метаданные.Задачи.Содержит(ОбъектМД) Тогда
		НовыйОбъект = Задачи[пИмя].СоздатьЗадачу();

	Иначе
		НовыйОбъект = Неопределено;
	КонецЕсли;

	Возврат НовыйОбъект;
КонецФункции

&НаСервереБезКонтекста
Функция вУстановитьСсылкуНового(пОбъект, Знач пСтрокаUUID)
	Попытка
		пUUID = Новый УникальныйИдентификатор(пСтрокаUUID);
	Исключение
		Сообщить("Неправильный формат UUID!");
		Возврат Ложь;
	КонецПопытки;

	ОбъектМД = пОбъект.Метаданные();
	пИмя = ОбъектМД.Имя;

	Если Метаданные.Справочники.Содержит(ОбъектМД) Тогда
		пМенеджер = Справочники[пИмя];

	ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМД) Тогда
		пМенеджер = ПланыВидовХарактеристик[пИмя];

	ИначеЕсли Метаданные.ПланыОбмена.Содержит(ОбъектМД) Тогда
		пМенеджер = ПланыОбмена[пИмя];

	ИначеЕсли Метаданные.Документы.Содержит(ОбъектМД) Тогда
		пМенеджер = Документы[пИмя];

	ИначеЕсли Метаданные.ПланыСчетов.Содержит(ОбъектМД) Тогда
		пМенеджер = ПланыСчетов[пИмя];

	ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(ОбъектМД) Тогда
		пМенеджер = ПланыВидовРасчета[пИмя];

	ИначеЕсли Метаданные.БизнесПроцессы.Содержит(ОбъектМД) Тогда
		пМенеджер = БизнесПроцессы[пИмя];

	ИначеЕсли Метаданные.Задачи.Содержит(ОбъектМД) Тогда
		пМенеджер = Задачи[пИмя];

	Иначе
		Сообщить(ОбъектМД.ПолноеИмя() + " - данный тип не обрабатывается!");
		Возврат Ложь;
	КонецЕсли;

	Попытка
		пНоваяСсылка = пМенеджер.ПолучитьСсылку(пUUID);
		пОбъект.УстановитьСсылкуНового(пНоваяСсылка);
	Исключение
		Сообщить("Не удалось установить ссылку для нового объекта!");
		Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;

	Возврат Истина;
КонецФункции

&НаСервереБезКонтекста
Функция вПолучитьСсылкуНаОбъект(Знач пСсылка)
	УстановитьПривилегированныйРежим(Истина);

	пПолноеИмя = пСсылка.Метаданные().ПолноеИмя();

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Ссылка", пСсылка);

	Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
				   |	т.Ссылка КАК Ссылка
				   |ИЗ
				   |	" + пПолноеИмя + " КАК т
										 |ГДЕ
										 |	т.Ссылка = &Ссылка";

	Выборка = Запрос.Выполнить().Выбрать();

	Возврат ?(Выборка.Следующий(), Выборка.Ссылка, Неопределено);
КонецФункции

&НаСервере
Функция вЗаписатьОбъект(Знач КакНовый = Ложь, Знач пСтрокаUUID = Неопределено)
	Если КакНовый Тогда
		Если Не вПроверитьСуществованиеОбъекта(мОбъектСсылка) Тогда
			ОбъектМД = мОбъектСсылка.Метаданные();
			ОбъектДляЗаписи = вСоздатьНовыйОбъект(ОбъектМД);
			Если ОбъектДляЗаписи = Неопределено Тогда
				Сообщить("Не удалось создать новый объект типа " + ОбъектМД.ПолноеИмя());
				Возврат Ложь;
			КонецЕсли;
		Иначе
			ОбъектДляЗаписи = мОбъектСсылка.Скопировать();
		КонецЕсли;

		Если пСтрокаUUID <> Неопределено Тогда
			Если Не вУстановитьСсылкуНового(ОбъектДляЗаписи, пСтрокаUUID) Тогда
				Возврат Ложь;
			КонецЕсли;
		КонецЕсли;
	Иначе
		ОбъектДляЗаписи = мОбъектСсылка.ПолучитьОбъект();
	КонецЕсли;

	Если ОбъектДляЗаписи = Неопределено Тогда
		Сообщить("Не удалось получить объект для записи (битая ссылка)!");
		Возврат Ложь;
	КонецЕсли;

//	Если _ЗаписьВРежимеЗагрузки Тогда
//		ОбъектДляЗаписи.ОбменДанными.Загрузка = Истина;
//	КонецЕсли;

//	Если _ИспользоватьДополнительныеСвойстваПриЗаписи И _ДополнительныеСвойства.Количество() <> 0 Тогда
//		Попытка
//			Для Каждого Стр Из _ДополнительныеСвойства Цикл
//				ОбъектДляЗаписи.ДополнительныеСвойства.Вставить(Стр.Ключ, Стр.Значение);
//			КонецЦикла;
//		Исключение
//			Сообщить("Ошибка при установке ДополнительныхСвойств: неправильное значение ключа """ + Стр.Ключ + """");
//			Возврат Ложь;
//		КонецПопытки;
//	КонецЕсли;

	Струк = Новый Структура("ЭтоГруппа");

	Попытка
		ОбъектМД = ОбъектДляЗаписи.Метаданные();
		ЭтоИерархияГруппИЭлементов = вЭтоИерархияГруппИЭлементов(ОбъектМД);
		ЭтоГруппа = ?(ЭтоИерархияГруппИЭлементов, ОбъектДляЗаписи.ЭтоГруппа, Ложь);

		Для Каждого Стр Из РеквизитыОбъекта Цикл
			Если Не Струк.Свойство(Стр.Имя) И Стр.Категория <> -1 Тогда
				Если ЭтоИерархияГруппИЭлементов Тогда
					Если (ЭтоГруппа И Стр.ДляГруппыИлиЭлемента = 1) Или (Не ЭтоГруппа И Стр.ДляГруппыИлиЭлемента = -1) Тогда
						Продолжить;
					КонецЕсли;
				КонецЕсли;
				Если ОбъектДляЗаписи[Стр.Имя] <> Стр.Значение Тогда
					ОбъектДляЗаписи[Стр.Имя] = Стр.Значение;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		
		// специализированные табличные части 1С
		вЗаписатьСпециализированныеТабличныеЧасти(ОбъектМД, ОбъектДляЗаписи);

		Для Каждого ЭлемТЧ Из ОбъектМД.ТабличныеЧасти Цикл
			Если ЭтоИерархияГруппИЭлементов Тогда
				Если (ЭтоГруппа И ЭлемТЧ.Использование
					= Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента) Тогда
					Продолжить;
				КонецЕсли;
				Если (Не ЭтоГруппа И ЭлемТЧ.Использование
					= Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы) Тогда
					Продолжить;
				КонецЕсли;
			КонецЕсли;
			ТабЧасть = ОбъектДляЗаписи[ЭлемТЧ.Имя];
			ТабЧасть.Очистить();
			ИмяТаб = _ПрефиксДляНовыхЭлементов + ЭлемТЧ.Имя;
			ТабРезультат = РеквизитФормыВЗначение(ИмяТаб);
			ТабЧасть.Загрузить(ТабРезультат);
		КонецЦикла;

//		Если _ИспользоватьПроцедуруПередЗаписью И Не ПустаяСтрока(_ПроцедураПередЗаписью) Тогда
//			Если Не вВыполнитьПроцедуруПередЗаписью(ОбъектДляЗаписи, _ПроцедураПередЗаписью) Тогда
//				Возврат Ложь;
//			КонецЕсли;
//		КонецЕсли;
//
//		ОбъектДляЗаписи.Записать();
		Если УИ_ОбщегоНазначения.ЗаписатьОбъектВБазу(ОбъектДляЗаписи,
			УИ_ОбщегоНазначенияКлиентСервер.ПараметрыЗаписиФормы(ЭтотОбъект)) Тогда
			мОбъектСсылка = ОбъектДляЗаписи.Ссылка;
			вОбновитьДанныеОбъекта();
			Возврат Истина;
		Иначе
			Возврат Ложь;
		КонецЕсли;
	Исключение
		Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;
КонецФункции

&НаСервереБезКонтекста
Функция вПроверитьСуществованиеОбъекта(Знач пСсылка)
	Если пСсылка = Неопределено Или Не ЗначениеЗаполнено(пСсылка) Тогда
		Возврат Ложь;
	КонецЕсли;

	УстановитьПривилегированныйРежим(Истина);

	пПолноеИмя = пСсылка.Метаданные().ПолноеИмя();

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Ссылка", пСсылка);

	Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
				   |	т.Ссылка КАК Ссылка
				   |ИЗ
				   |	" + пПолноеИмя + " КАК т
										 |ГДЕ
										 |	т.Ссылка = &Ссылка";

	Возврат Не Запрос.Выполнить().Пустой();
КонецФункции

&НаСервере
Функция вУдалитьОбъектНаСервере(Знач Ссылка)
	Попытка
		пОбъект = Ссылка.ПолучитьОбъект();
		Если пОбъект = Неопределено Тогда
			Возврат Ложь;
		КонецЕсли;

		Если УИ_ОбщегоНазначения.ЗаписатьОбъектВБазу(пОбъект, УИ_ОбщегоНазначенияКлиентСервер.ПараметрыЗаписиФормы(
			ЭтотОбъект), "НепосредственноеУдаление") Тогда

			Возврат Истина;
		Иначе
			Возврат Ложь;
		КонецЕсли;
	Исключение
		Сообщить("Ошибка при удалении объекта:" + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		Возврат Ложь;
	КонецПопытки;
КонецФункции

&НаСервере
Процедура вОбновитьНаборЗаписей()
	_НаборЗаписей.Очистить();

	НадоИзменитьРеквизиты = (_ИмяНабораЗаписей <> _ИмяНабораЗаписейПредыдущий);

	МассивКСозданию = Новый Массив;
	МассивКУдалению = Новый Массив;

	Если НадоИзменитьРеквизиты Тогда
		ТабРезультат = РеквизитФормыВЗначение("_НаборЗаписей");
		Для Каждого Колонка Из ТабРезультат.Колонки Цикл
			МассивКУдалению.Добавить("_НаборЗаписей." + Колонка.Имя);
			Элем = Элементы.Найти("_НаборЗаписей_" + Колонка.Имя);
			Если Элем <> Неопределено Тогда
				Элементы.Удалить(Элем);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

	Если Не ПустаяСтрока(_ИмяНабораЗаписей) Тогда
		Менеджер = вСоздатьМенеджерНабораЗаписей(_ИмяНабораЗаписей);
		Если Менеджер = Неопределено Тогда
			Если НадоИзменитьРеквизиты Тогда
				ИзменитьРеквизиты(МассивКСозданию, МассивКУдалению);
			КонецЕсли;
			Возврат;
		КонецЕсли;

		Набор = Менеджер.СоздатьНаборЗаписей();
		Набор.Отбор.Регистратор.Установить(мОбъектСсылка);
		Набор.Прочитать();

		ТабРезультат = Набор.Выгрузить();

		Попытка
			Если НадоИзменитьРеквизиты Тогда
				ТипХЗ = Тип("ХранилищеЗначения");
				ТипТТ = Тип("Тип");
				ТипМВ = Тип("МоментВремени");
				ТипUUID = Тип("УникальныйИдентификатор");

				СтрукСпецКолонки = Новый Структура("Регистратор, МоментВремени");

				Для Каждого Колонка Из ТабРезультат.Колонки Цикл
					//Если СтрукСпецКолонки.Свойство(Колонка.Имя) Тогда
					//	Продолжить;
					//КонецЕсли;

					Если Колонка.ТипЗначения.СодержитТип(ТипХЗ) Тогда
						ТипЗначенияРеквизита = Новый ОписаниеТипов;
					ИначеЕсли Колонка.ТипЗначения.СодержитТип(ТипТТ) Тогда
						ТипЗначенияРеквизита = Новый ОписаниеТипов;
					ИначеЕсли Колонка.ТипЗначения.СодержитТип(ТипМВ) Тогда
						ТипЗначенияРеквизита = Новый ОписаниеТипов;
					ИначеЕсли Колонка.ТипЗначения.СодержитТип(ТипUUID) Тогда
						ТипЗначенияРеквизита = вОписаниеТиповДляUUID(Колонка.ТипЗначения);
					Иначе
						ТипЗначенияРеквизита = Колонка.ТипЗначения;
					КонецЕсли;
					МассивКСозданию.Добавить(Новый РеквизитФормы(Колонка.Имя, ТипЗначенияРеквизита, "_НаборЗаписей",
						Колонка.Заголовок, Ложь));
				КонецЦикла;

				ИзменитьРеквизиты(МассивКСозданию, МассивКУдалению);
			КонецЕсли;

			ЗначениеВРеквизитФормы(ТабРезультат, "_НаборЗаписей");

			Если НадоИзменитьРеквизиты Тогда
				Для Каждого Колонка Из ТабРезультат.Колонки Цикл
					Если СтрукСпецКолонки.Свойство(Колонка.Имя) Тогда
						Продолжить;
					КонецЕсли;

					Элем = ЭтаФорма.Элементы.Добавить("_НаборЗаписей_" + Колонка.Имя, Тип("ПолеФормы"),
						ЭтаФорма.Элементы._НаборЗаписей);
					Элем.ПутьКДанным="_НаборЗаписей." + Колонка.Имя;
					Элем.Вид=ВидПоляФормы.ПолеВвода;
					Элем.ДоступныеТипы=Колонка.ТипЗначения;
					Элем.КнопкаОчистки = Истина;
					Элем.КнопкаВыбора = Истина;
		
					Элем.УстановитьДействие("НачалоВыбора", "Подключаемый_НаборЗаписейРеквизитНачалоВыбора");
					Элем.УстановитьДействие("Очистка", "Подключаемый_НаборЗаписейРеквизитОчистка");
					
				КонецЦикла;
			КонецЕсли;

		Исключение
			Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		КонецПопытки;

	ИначеЕсли НадоИзменитьРеквизиты Тогда
		ИзменитьРеквизиты(МассивКСозданию, МассивКУдалению);
	КонецЕсли;

	_ИмяНабораЗаписейПредыдущий = _ИмяНабораЗаписей;
КонецПроцедуры

&НаСервере
Процедура вЗаписатьНаборЗаписей()
	Если Не ПустаяСтрока(_ИмяНабораЗаписей) И ЗначениеЗаполнено(мОбъектСсылка) Тогда
		Менеджер = вСоздатьМенеджерНабораЗаписей(_ИмяНабораЗаписей);
		Если Менеджер <> Неопределено Тогда
			Набор = Менеджер.СоздатьНаборЗаписей();
			Набор.Отбор.Регистратор.Установить(мОбъектСсылка);
			ПараметрыЗаписи=УИ_ОбщегоНазначенияКлиентСервер.ПараметрыЗаписиФормы(ЭтотОбъект);

			Если ПараметрыЗаписи.ЗаписьВРежимеЗагрузки Тогда
				Набор.ОбменДанными.Загрузка = Истина;
			КонецЕсли;

			Попытка
				ТабРезультат = РеквизитФормыВЗначение("_НаборЗаписей");
				ТабРезультат.ЗаполнитьЗначения(мОбъектСсылка, "Регистратор");
				Набор.Загрузить(ТабРезультат);

				Набор.Записать(Истина);

				вОбновитьНаборЗаписей();
			Исключение
				Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
			КонецПопытки;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция вСоздатьМенеджерНабораЗаписей(Знач пИмяНабораЗаписей)
	Поз = СтрНайти(пИмяНабораЗаписей, ".");

	пВидРегистра = Лев(пИмяНабораЗаписей, Поз - 1);
	пИмяРегистра = Сред(пИмяНабораЗаписей, Поз + 1);

	Менеджер = Неопределено;

	Если пВидРегистра = "РегистрСведений" Тогда
		Менеджер = РегистрыСведений[пИмяРегистра];
	ИначеЕсли пВидРегистра = "РегистрНакопления" Тогда
		Менеджер = РегистрыНакопления[пИмяРегистра];
	ИначеЕсли пВидРегистра = "РегистрРасчета" Тогда
		Менеджер = РегистрыРасчета[пИмяРегистра];
	ИначеЕсли пВидРегистра = "РегистрБухгалтерии" Тогда
		Менеджер = РегистрыБухгалтерии[пИмяРегистра];
	КонецЕсли;

	Возврат Менеджер;
КонецФункции
&НаСервереБезКонтекста
Функция вОписаниеТиповДляUUID(пОписаниеТипов)
	Если пОписаниеТипов.Типы().Количество() = 1 Тогда
		пНовоеОписаниеТипов = Новый ОписаниеТипов(пОписаниеТипов, "Строка");
	Иначе
		пНовоеОписаниеТипов = пОписаниеТипов;
	КонецЕсли;

	Возврат пНовоеОписаниеТипов;
КонецФункции

&НаСервере
Процедура вОчиститьДанныеОбъекта()
	РеквизитыОбъекта.Очистить();
КонецПроцедуры

&НаСервере
Процедура вЗаполнитьДанныеОбъекта(НадоСоздаватьРеквизиты)
	Перем НС;

	СтрукТипы = вСформироватьСтруктуруТипов();
	пТипХЗ = Тип("ХранилищеЗначения");

	Если НадоСоздаватьРеквизиты Тогда
		МассивКСозданию = Новый Массив;
		МассивКУдалению = Новый Массив;
		
		// специализированные табличные части 1С
		СтрукСпецДанные = Новый Структура(вПереченьСпециализированныхТабличныхЧастей("ПланСчетов") + ", "
			+ вПереченьСпециализированныхТабличныхЧастей("ПланВидовРасчета"));

		Если мОбъектСсылкаПредыдущий <> Неопределено Тогда
			ОбъектМД = мОбъектСсылкаПредыдущий.Метаданные();
			Для Каждого ЭлемТЧ Из ОбъектМД.ТабличныеЧасти Цикл
				ИмяТаб = _ПрефиксДляНовыхЭлементов + ЭлемТЧ.Имя;
				МассивКУдалению.Добавить(ИмяТаб);
			КонецЦикла;
			
			// специализированные табличные части 1С
			Для Каждого Элем Из СтрукСпецДанные Цикл
				ИмяТаб = _ПрефиксДляНовыхЭлементов + Элем.Ключ;
				Если вПроверитьНаличиеРеквизитаФормы(ИмяТаб) Тогда
					МассивКУдалению.Добавить(ИмяТаб);
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		_ИмяНабораЗаписей = "";
		ВидимостьРазделаДвижения = Ложь;
		Если Не ПустаяСтрока(_ИмяНабораЗаписейПредыдущий) Тогда
			вОбновитьНаборЗаписей();
		КонецЕсли;

		Если мОбъектСсылка <> Неопределено Тогда
			ОбъектМД = мОбъектСсылка.Метаданные();

			Если Метаданные.Документы.Содержит(ОбъектМД) Тогда
				Если ОбъектМД.Движения.Количество() <> 0 Тогда
					ВидимостьРазделаДвижения = Истина;
					_ПроведениеРазрешено = (ОбъектМД.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить);

					Список = Элементы._ИмяНабораЗаписей.СписокВыбора;
					Список.Очистить();
					Для Каждого ОбъектРегистрМД Из ОбъектМД.Движения Цикл
						Список.Добавить(ОбъектРегистрМД.ПолноеИмя(), ОбъектРегистрМД.Представление());
					КонецЦикла;

					Список.СортироватьПоЗначению();
				КонецЕсли;
			КонецЕсли;
			
			// специализированные табличные части 1С
			вСоздатьСпециализированныеТабличныеЧасти(ОбъектМД, МассивКСозданию);

			Для Каждого ЭлемТЧ Из ОбъектМД.ТабличныеЧасти Цикл
				ИмяТаб = _ПрефиксДляНовыхЭлементов + ЭлемТЧ.Имя;
				МассивКСозданию.Добавить(Новый РеквизитФормы(ИмяТаб, Новый ОписаниеТипов("ТаблицаЗначений"), ,
					ЭлемТЧ.Имя));
				Для Каждого Элем Из ЭлемТЧ.Реквизиты Цикл
					Если Элем.Тип.СодержитТип(пТипХЗ) Тогда
						МассивКСозданию.Добавить(Новый РеквизитФормы(Элем.Имя, Новый ОписаниеТипов, ИмяТаб, Элем.Имя));
					ИначеЕсли Элем.Тип.СодержитТип(СтрукТипы.мТипУникальныйИдентификатор) Тогда
						МассивКСозданию.Добавить(Новый РеквизитФормы(Элем.Имя, вОписаниеТиповДляUUID(Элем.Тип), ИмяТаб,
							Элем.Имя));
					Иначе
						МассивКСозданию.Добавить(Новый РеквизитФормы(Элем.Имя, Элем.Тип, ИмяТаб, Элем.Имя));
					КонецЕсли;
				КонецЦикла;
			КонецЦикла;
		КонецЕсли;
		Элементы.СтрДвиженияДокумента.Видимость = ВидимостьРазделаДвижения;

		Если МассивКСозданию.Количество() <> 0 Или МассивКУдалению.Количество() <> 0 Тогда
			ИзменитьРеквизиты(МассивКСозданию, МассивКУдалению);
		КонецЕсли;

		Если МассивКУдалению.Количество() <> 0 Тогда
			ОбъектМД = мОбъектСсылкаПредыдущий.Метаданные();
			
			// специализированные табличные части 1С
			Для Каждого Элем Из СтрукСпецДанные Цикл
				ИмяТаб = _ПрефиксДляНовыхЭлементов + Элем.Ключ;
				ЭФ = Элементы.Найти("Стр" + ИмяТаб);
				Если ЭФ <> Неопределено Тогда
					Элементы.Удалить(ЭФ);
				КонецЕсли;
			КонецЦикла;

			Для Каждого ЭлемТЧ Из ОбъектМД.ТабличныеЧасти Цикл
				ИмяТаб = _ПрефиксДляНовыхЭлементов + ЭлемТЧ.Имя;
				Элементы.Удалить(Элементы.Найти("Стр" + ИмяТаб));
			КонецЦикла;
		КонецЕсли;

		Если МассивКСозданию.Количество() <> 0 Тогда
			ОбъектМД = мОбъектСсылка.Метаданные();
			
			// специализированные табличные части 1С
			вСоздатьСпециализированныеТабличныеЧасти_Элементы(ОбъектМД);

			Для Каждого ЭлемТЧ Из ОбъектМД.ТабличныеЧасти Цикл
				ИмяТаб = _ПрефиксДляНовыхЭлементов + ЭлемТЧ.Имя;
				НоваяСтраница = Элементы.Добавить("Стр" + ИмяТаб, Тип("ГруппаФормы"), Элементы.ГруппаСтраницы);
				НоваяСтраница.Вид = ВидГруппыФормы.Страница;
				НоваяСтраница.Заголовок = ЗаголовокСтраницыТабличнойЧасти(ЭлемТЧ.Имя, мОбъектСсылка[ЭлемТЧ.Имя]);
				НоваяСтраница.Подсказка = ЭлемТЧ.Представление();

				ШаблонОформленияЭФ = Элементы.ДекорацияРеквизитыОбъекта;
				ЭФ = Элементы.Добавить("Надпись_" + ИмяТаб, Тип("ДекорацияФормы"), НоваяСтраница);
				ЭФ.Вид = ВидДекорацииФормы.Надпись;
				ЭФ.ЦветТекста = ШаблонОформленияЭФ.ЦветТекста;
				ЭФ.Шрифт = ШаблонОформленияЭФ.Шрифт;
				ЭФ.АвтоМаксимальнаяШирина = Ложь;
				ЭФ.РастягиватьПоГоризонтали = Истина;
				ЭФ.Заголовок = ЭлемТЧ.Имя + ": " + ЭлемТЧ.Представление();

				НоваяТаблица = Элементы.Добавить("Таб" + ИмяТаб, Тип("ТаблицаФормы"), НоваяСтраница);
				НоваяТаблица.ПутьКДанным = ИмяТаб;

				Для Каждого Элем Из ЭлемТЧ.Реквизиты Цикл
					НоваяКолонка = Элементы.Добавить(НоваяТаблица.Имя + Элем.Имя, Тип("ПолеФормы"), НоваяТаблица);
					НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
					НоваяКолонка.ПутьКДанным = ИмяТаб + "." + Элем.Имя;
					НоваяКолонка.КнопкаОчистки = Истина;
					НоваяКолонка.КнопкаВыбора = Истина;
					Если Не Элем.Тип.СодержитТип(пТипХЗ) Тогда
						НоваяКолонка.ДоступныеТипы = Элем.Тип;
					КонецЕсли;
					
					НоваяКолонка.УстановитьДействие("НачалоВыбора", "Подключаемый_ТабличнаяЧастьРеквизитНачалоВыбора");
					НоваяКолонка.УстановитьДействие("Очистка", "Подключаемый_ТабличнаяЧастьРеквизитОчистка");
				КонецЦикла;

				НоваяТаблица.УстановитьДействие("ПриОкончанииРедактирования",
												"Подключаемый_ТабличнаяЧастьПриОкончанииРедактирования");
				НоваяТаблица.УстановитьДействие("ПослеУдаления", "Подключаемый_ТабличнаяЧастьПослеУдаления");
				
				// контекстное меню
				ГруппаКнопок = Элементы.Добавить("Группа_" + ИмяТаб, Тип("ГруппаФормы"), НоваяТаблица.КонтекстноеМеню);
				ГруппаКнопок.Вид = ВидГруппыФормы.ГруппаКнопок;

				Кнопка = Элементы.Добавить("_ВставитьУникальныйИдентификатор_" + ИмяТаб, Тип("КнопкаФормы"),
					ГруппаКнопок);
				Кнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
				Кнопка.ИмяКоманды = "_ВставитьУникальныйИдентификатор";

				Кнопка = Элементы.Добавить("ОткрытьОбъект_" + ИмяТаб, Тип("КнопкаФормы"), ГруппаКнопок);
				Кнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
				Кнопка.ИмяКоманды = "ОткрытьОбъект";
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;	
	
	Если мОбъектСсылка <> Неопределено Тогда
		ПолноеИмя = мОбъектСсылка.Метаданные().ПолноеИмя();
		ВидОбъекта = Лев(ПолноеИмя, Найти(ПолноеИмя, ".") - 1);
		_ТипОбъекта = ПолноеИмя;

		_UUID = мОбъектСсылка.УникальныйИдентификатор();
		_URL  = вПолучитьНавигационнуюСсылку(мОбъектСсылка);

		ОбъектМД = Метаданные.НайтиПоПолномуИмени(ПолноеИмя);

		Если ОбъектМД <> Неопределено Тогда

			ЭтоИерархияГруппИЭлементов = вЭтоИерархияГруппИЭлементов(ОбъектМД);

			вЗаполнитьСтандартныеРеквизиты(ОбъектМД);
			
			Для Каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл
				ЭлементСостава = ОбщийРеквизит.Состав.Найти(ОбъектМД);
				Если ЭлементСостава <> Неопределено
					И ЭлементСостава.Использование = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Использовать 
					Тогда
					
					НС = РеквизитыОбъекта.Добавить();
					НС.Имя = ОбщийРеквизит.Имя;
					НС.Представление = ОбщийРеквизит.Представление();
					НС.Категория = 1;
					НС.ТипЗначения = ОбщийРеквизит.Тип;
					НС.ТипСтрокой = вОписаниеТиповВСтроку(ОбщийРеквизит.Тип, СтрукТипы);
					НС.Значение = мОбъектСсылка[НС.Имя];
					
				КонецЕсли;	
			КонецЦикла;

			Для Каждого Элем Из ОбъектМД.Реквизиты Цикл
				НС = РеквизитыОбъекта.Добавить();
				НС.Имя = Элем.Имя;
				НС.Представление = Элем.Представление();
				НС.Категория = 1;
				НС.ТипЗначения = Элем.Тип;
				НС.ТипСтрокой = вОписаниеТиповВСтроку(Элем.Тип, СтрукТипы);
				НС.Значение = мОбъектСсылка[Элем.Имя];

				Если ЭтоИерархияГруппИЭлементов Тогда
					Если Элем.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляГруппы Тогда
						НС.ДляГруппыИлиЭлемента = -1;
					ИначеЕсли Элем.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента Тогда
						НС.ДляГруппыИлиЭлемента = 1;
					Иначе
						НС.ДляГруппыИлиЭлемента = 0;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;

			Если ВидОбъекта = "ПланСчетов" Тогда
				Для Каждого Элем Из ОбъектМД.ПризнакиУчета Цикл
					НС = РеквизитыОбъекта.Добавить();
					НС.Имя = Элем.Имя;
					НС.Представление = Элем.Представление();
					НС.Категория = 1;
					НС.ТипЗначения = Элем.Тип;
					НС.ТипСтрокой = вОписаниеТиповВСтроку(Элем.Тип, СтрукТипы);
					НС.Значение = мОбъектСсылка[Элем.Имя];
				КонецЦикла;
			КонецЕсли;

			Если ВидОбъекта = "Задача" Тогда
				Для Каждого Элем Из ОбъектМД.РеквизитыАдресации Цикл
					НС = РеквизитыОбъекта.Добавить();
					НС.Имя = Элем.Имя;
					НС.Представление = Элем.Представление();
					НС.Категория = 1;
					НС.ТипЗначения = Элем.Тип;
					НС.ТипСтрокой = вОписаниеТиповВСтроку(Элем.Тип, СтрукТипы);
					НС.Значение = мОбъектСсылка[Элем.Имя];
				КонецЦикла;
			КонецЕсли;

			РеквизитыОбъекта.Сортировать("Категория, Имя");
			
			// специализированные табличные части 1С
			вЗаполнитьСпециализированныеТабличныеЧасти(ОбъектМД);

			Для Каждого ЭлемТЧ Из ОбъектМД.ТабличныеЧасти Цикл
				ИмяТаб = _ПрефиксДляНовыхЭлементов + ЭлемТЧ.Имя;
				ТабРезультат = мОбъектСсылка[ЭлемТЧ.Имя].Выгрузить();
				ЗначениеВРеквизитФормы(ТабРезультат, ИмяТаб);
			КонецЦикла;
		КонецЕсли;
	Иначе
		_ТипОбъекта = "";
	КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция вПереченьСпециализированныхТабличныхЧастей(ВидОбъекта)
	Если ВидОбъекта = "ПланСчетов" Тогда
		Возврат "ВидыСубконто";
	ИначеЕсли ВидОбъекта = "ПланВидовРасчета" Тогда
		Возврат "БазовыеВидыРасчета, ВедущиеВидыРасчета, ВытесняющиеВидыРасчета";
	Иначе
		Возврат "";
	КонецЕсли;
КонецФункции

&НаСервереБезКонтекста
Функция вПроверитьНаличиеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ЗначениеДляОтсутствующего = -1)
	Струк = Новый Структура(ИмяРеквизита, ЗначениеДляОтсутствующего);
	ЗаполнитьЗначенияСвойств(Струк, Ссылка);

	Возврат (Струк[ИмяРеквизита] <> ЗначениеДляОтсутствующего);
КонецФункции

&НаСервереБезКонтекста
Функция вСформироватьОтчетПоДвижениям(Знач ДокСсылка, Знач СписокРегистров, Знач пКонфигурацияДопускаетДопДвижения)
	пЧислоТаблицВЗапросе = 200;

	Если пКонфигурацияДопускаетДопДвижения Тогда
		пСтрук = вОпределитьДополнительныеРегистрыДокумента(ДокСсылка);
		Если пСтрук.ЕстьДанные Тогда
			Для Каждого Элем Из пСтрук.ДополнительныеРегистры Цикл
				СписокРегистров.Добавить("+" + Элем.Ключ, Элем.Значение);
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Регистратор", ДокСсылка);

	ТекстНачалаЗапроса = "ВЫБРАТЬ 0 КАК Инд, 100000000 КАК ПолеА ГДЕ ложь";
	ТекстЗапроса = ТекстНачалаЗапроса;

	ТабРезультат = Неопределено;
	Инд = -1;
	Сч = 0;

	Для Каждого Элем Из СписокРегистров Цикл
		Инд = Инд + 1;
		Сч = Сч + 1;

		Если Сч > пЧислоТаблицВЗапросе Тогда
			Сч = 1;

			Запрос.Текст = ТекстЗапроса;
			ТабДанные = Запрос.Выполнить().Выгрузить();

			Если ТабРезультат = Неопределено Тогда
				ТабРезультат = ТабДанные;
			Иначе
				Для Каждого Стр Из ТабДанные Цикл
					ЗаполнитьЗначенияСвойств(ТабРезультат.Добавить(), Стр);
				КонецЦикла;
			КонецЕсли;

			ТекстЗапроса = ТекстНачалаЗапроса;
		КонецЕсли;

		Если Лев(Элем.Значение, 1) = "+" Тогда
			ТекстЗапроса = ТекстЗапроса + "
										  |ОБЪЕДИНИТЬ ВСЕ
										  |ВЫБРАТЬ " + Инд + ", КОЛИЧЕСТВО(*) ИЗ " + Сред(Элем.Значение, 2)
				+ " КАК т ГДЕ т.ДокументРегистратор = &Регистратор ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 0";
		Иначе
			ТекстЗапроса = ТекстЗапроса + "
										  |ОБЪЕДИНИТЬ ВСЕ
										  |ВЫБРАТЬ " + Инд + ", КОЛИЧЕСТВО(*) ИЗ " + Элем.Значение
				+ " КАК т ГДЕ т.Регистратор = &Регистратор ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 0";
		КонецЕсли;
	КонецЦикла;

	Запрос.Текст = ТекстЗапроса;
	ТабДанные = Запрос.Выполнить().Выгрузить();

	Если ТабРезультат = Неопределено Тогда
		ТабРезультат = ТабДанные;
	Иначе
		Для Каждого Стр Из ТабДанные Цикл
			ЗаполнитьЗначенияСвойств(ТабРезультат.Добавить(), Стр);
		КонецЦикла;
	КонецЕсли;

	Линия1 = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 2);

	ТДок = Новый ТабличныйДокумент;

	ТДок.Область( , 1, , 1).ШиринаКолонки = 2;
	ТДок.Область( , 2, , 2).ШиринаКолонки = 50;
	ТДок.Область( , 3, , 3).ШиринаКолонки = 50;
	ТДок.Область( , 4, , 4).ШиринаКолонки = 12;

	ТДок.Область(2, 2).Текст = Строка(ДокСсылка);
	ТДок.Область(2, 2, 2, 3).Обвести( , , , Линия1);

	ТДок.Область(4, 2).Текст = "Имя регистра";
	ТДок.Область(4, 3).Текст = "Представление";
	ТДок.Область(4, 4).Текст = "Число записей";
	ТДок.Область(4, 2, 4, 4).ЦветФона = WebЦвета.СветлоЖелтыйЗолотистый;
	ТДок.Область(4, 2, 4, 4).Обвести(Линия1, Линия1, Линия1, Линия1);

	НПП = 4;
	Для Каждого Стр Из ТабРезультат Цикл
		НПП = НПП + 1;
		пИмяРегистра = СписокРегистров[Стр.Инд].Значение;
		пЭтоДопДвижение = пКонфигурацияДопускаетДопДвижения И (Лев(пИмяРегистра, 1) = "+");

		ТДок.Область(НПП, 2).Текст = ?(пЭтоДопДвижение, Сред(пИмяРегистра, 2), пИмяРегистра);
		ТДок.Область(НПП, 3).Текст = СписокРегистров[Стр.Инд].Представление;
		ТДок.Область(НПП, 4).Текст = Стр.ПолеА;

		Если пЭтоДопДвижение Тогда
			ТДок.Область(НПП, 2, НПП, 4).ЦветТекста = WebЦвета.Зеленый;
		КонецЕсли;
	КонецЦикла;

	ТДок.Область(4, 2, НПП, 4).Обвести(Линия1, Линия1, Линия1, Линия1);

	Возврат ТДок;
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция вПолучитьНавигационнуюСсылку(Ссылка)
	// на некотрых платформах возникает ошибка при получении НавСсылки определенных объектов (на пример, счета БУ)

	Попытка
		Возврат ПолучитьНавигационнуюСсылку(Ссылка);
	Исключение
		Возврат "";
	КонецПопытки;
КонецФункции

&НаСервере
Функция вПроверитьНаличиеРеквизитаФормы(ИмяРеквизита, ЗначениеДляОтсутствующего = -1)
	Струк = Новый Структура(ИмяРеквизита, ЗначениеДляОтсутствующего);
	ЗаполнитьЗначенияСвойств(Струк, ЭтаФорма);

	Возврат (Струк[ИмяРеквизита] <> ЗначениеДляОтсутствующего);
КонецФункции

&НаСервере
Процедура вСоздатьСпециализированныеТабличныеЧасти(Знач ОбъектМД, Знач МассивКСозданию)
	ПолноеИмя = ОбъектМД.ПолноеИмя();
	ВидОбъекта = Лев(ПолноеИмя, Найти(ПолноеИмя, ".") - 1);

	ПереченьТЧ = вПереченьСпециализированныхТабличныхЧастей(ВидОбъекта);
	Если Не ПустаяСтрока(ПереченьТЧ) Тогда
		Струк = Новый Структура(ПереченьТЧ);
		Для Каждого Элем Из Струк Цикл
			ИмяТЧ = Элем.Ключ;
			Если вПроверитьНаличиеРеквизитаОбъекта(мОбъектСсылка, ИмяТЧ) Тогда
				ТабРезультат = мОбъектСсылка[ИмяТЧ].Выгрузить();

				ИмяТаб = _ПрефиксДляНовыхЭлементов + ИмяТЧ;
				МассивКСозданию.Добавить(Новый РеквизитФормы(ИмяТаб, Новый ОписаниеТипов("ТаблицаЗначений"), , ИмяТЧ));
				Для Каждого Элем Из ТабРезультат.Колонки Цикл
					Если Элем.Имя <> "НомерСтроки" Тогда
						МассивКСозданию.Добавить(Новый РеквизитФормы(Элем.Имя, Элем.ТипЗначения, ИмяТаб, Элем.Имя));
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура вСоздатьСпециализированныеТабличныеЧасти_Элементы(Знач ОбъектМД)
	ПолноеИмя = ОбъектМД.ПолноеИмя();
	ВидОбъекта = Лев(ПолноеИмя, Найти(ПолноеИмя, ".") - 1);

	ПереченьТЧ = вПереченьСпециализированныхТабличныхЧастей(ВидОбъекта);
	Если Не ПустаяСтрока(ПереченьТЧ) Тогда
		Струк = Новый Структура(ПереченьТЧ);
		Для Каждого Элем Из Струк Цикл
			ИмяТЧ = Элем.Ключ;
			Если вПроверитьНаличиеРеквизитаОбъекта(мОбъектСсылка, ИмяТЧ) Тогда
				ТабРезультат = мОбъектСсылка[ИмяТЧ].Выгрузить();

				ИмяТаб = _ПрефиксДляНовыхЭлементов + ИмяТЧ;
				НоваяСтраница = Элементы.Добавить("Стр" + ИмяТаб, Тип("ГруппаФормы"), Элементы.ГруппаСтраницы);
				НоваяСтраница.Вид = ВидГруппыФормы.Страница;
				НоваяСтраница.Заголовок = ИмяТЧ;

				НоваяТаблица = Элементы.Добавить(ИмяТаб, Тип("ТаблицаФормы"), НоваяСтраница);
				НоваяТаблица.ПутьКДанным = ИмяТаб;

				Для Каждого Элем Из ТабРезультат.Колонки Цикл
					Если Элем.Имя <> "НомерСтроки" Тогда
						НоваяКолонка = Элементы.Добавить(ИмяТаб + Элем.Имя, Тип("ПолеФормы"), НоваяТаблица);
						НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
						НоваяКолонка.ПутьКДанным = ИмяТаб + "." + Элем.Имя;
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура вЗаполнитьСпециализированныеТабличныеЧасти(Знач ОбъектМД)
	ПолноеИмя = ОбъектМД.ПолноеИмя();
	ВидОбъекта = Лев(ПолноеИмя, Найти(ПолноеИмя, ".") - 1);

	ПереченьТЧ = вПереченьСпециализированныхТабличныхЧастей(ВидОбъекта);
	Если Не ПустаяСтрока(ПереченьТЧ) Тогда
		Струк = Новый Структура(ПереченьТЧ);
		Для Каждого Элем Из Струк Цикл
			ИмяТЧ = Элем.Ключ;
			ИмяТаб = _ПрефиксДляНовыхЭлементов + ИмяТЧ;

			Если вПроверитьНаличиеРеквизитаОбъекта(мОбъектСсылка, ИмяТЧ) Тогда
				ТабРезультат = мОбъектСсылка[ИмяТЧ].Выгрузить();
				ЗначениеВРеквизитФормы(ТабРезультат, ИмяТаб);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура вЗаписатьСпециализированныеТабличныеЧасти(ОбъектМД, ОбъектДляЗаписи)
	ПолноеИмя = ОбъектМД.ПолноеИмя();
	ВидОбъекта = Лев(ПолноеИмя, Найти(ПолноеИмя, ".") - 1);

	ПереченьТЧ = вПереченьСпециализированныхТабличныхЧастей(ВидОбъекта);
	Если Не ПустаяСтрока(ПереченьТЧ) Тогда
		Струк = Новый Структура(ПереченьТЧ);
		Для Каждого Элем Из Струк Цикл
			ИмяТЧ = Элем.Ключ;
			ИмяТаб = _ПрефиксДляНовыхЭлементов + ИмяТЧ;

			Если вПроверитьНаличиеРеквизитаОбъекта(ОбъектДляЗаписи, ИмяТЧ) Тогда
				ТабЧасть = ОбъектДляЗаписи[ИмяТЧ];
				ТабЧасть.Очистить();

				ТабРезультат = РеквизитФормыВЗначение(ИмяТаб);
				ТабЧасть.Загрузить(ТабРезультат);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция вОписаниеТиповВСтроку(ОписаниеТипов, СтрукТипы)
	Если ОписаниеТипов = Неопределено Тогда
		Возврат "";
	КонецЕсли;

	Значение = "";
	Типы = ОписаниеТипов.Типы();
	Для Каждого Элем Из Типы Цикл
		ИмяТипа = вИмяТипаСтрокой(СтрукТипы, Элем, ОписаниеТипов);
		Если Не ПустаяСтрока(ИмяТипа) Тогда
			Значение = Значение + "," + ИмяТипа;
		КонецЕсли;
	КонецЦикла;

	Возврат Сред(Значение, 2);
КонецФункции

&НаСервереБезКонтекста
Функция вИмяТипаСтрокой(СтрукТипы, Тип, ОписаниеТипов)
	ИмяТипа = "";

	Если Тип = СтрукТипы.мТипЧисло Тогда
		ИмяТипа = "Число";
		Если ОписаниеТипов.КвалификаторыЧисла.Разрядность <> 0 Тогда
			ИмяТипа = ИмяТипа + "(" + ОписаниеТипов.КвалификаторыЧисла.Разрядность + "."
				+ ОписаниеТипов.КвалификаторыЧисла.РазрядностьДробнойЧасти + ")";
		КонецЕсли;
	ИначеЕсли Тип = СтрукТипы.мТипСтрока Тогда
		ИмяТипа = "Строка";
		Если ОписаниеТипов.КвалификаторыСтроки.Длина <> 0 Тогда
			ИмяТипа = ИмяТипа + "(" + ?(ОписаниеТипов.КвалификаторыСтроки.ДопустимаяДлина = ДопустимаяДлина.Переменная,
				"П", "Ф") + ОписаниеТипов.КвалификаторыСтроки.Длина + ")";
		КонецЕсли;
	ИначеЕсли Тип = СтрукТипы.мТипДата Тогда
		ИмяТипа = ?(ОписаниеТипов.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Время, "Время", ?(
			ОписаниеТипов.КвалификаторыДаты.ЧастиДаты = ЧастиДаты.Дата, "Дата", "ДатаВремя"));
	ИначеЕсли Тип = СтрукТипы.мТипБулево Тогда
		ИмяТипа = "Булево";
	ИначеЕсли Тип = СтрукТипы.мТипДвоичныеДанные Тогда
		ИмяТипа = "ДвоичныеДанные";
	ИначеЕсли Тип = СтрукТипы.мТипХранилищеЗначения Тогда
		ИмяТипа = "ХранилищеЗначения";
	ИначеЕсли Тип = СтрукТипы.мТипУникальныйИдентификатор Тогда
		ИмяТипа = "УникальныйИдентификатор";
	Иначе
		ОбъектМД = Метаданные.НайтиПоТипу(Тип);
		Если ОбъектМД <> Неопределено Тогда
			ИмяТипа = ОбъектМД.ПолноеИмя();
		Иначе
			ИмяТипа = Строка(Тип);
		КонецЕсли;
	КонецЕсли;

	Возврат ИмяТипа;
КонецФункции

&НаСервереБезКонтекста
Функция вСформироватьСтруктуруТипов()
	Результат = Новый Структура;

	Результат.Вставить("мТипСтрока", Тип("Строка"));
	Результат.Вставить("мТипБулево", Тип("Булево"));
	Результат.Вставить("мТипЧисло", Тип("Число"));
	Результат.Вставить("мТипДата", Тип("Дата"));
	Результат.Вставить("мТипСтруктура", Тип("Структура"));
	Результат.Вставить("мТипХранилищеЗначения", Тип("ХранилищеЗначения"));
	Результат.Вставить("мТипДвоичныеДанные", Тип("ДвоичныеДанные"));
	Результат.Вставить("мТипДеревоЗначений", Тип("ДеревоЗначений"));
	Результат.Вставить("мТипОбъектМетаданных", Тип("ОбъектМетаданных"));
	Результат.Вставить("мТипУникальныйИдентификатор", Тип("УникальныйИдентификатор"));

	Возврат Результат;
КонецФункции

&НаСервереБезКонтекста
Функция вЭтоИерархияГруппИЭлементов(ОбъектМД)
	Струк = Новый Структура("Иерархический, ВидИерархии");
	ЗаполнитьЗначенияСвойств(Струк, ОбъектМД);
	Возврат (Струк.Иерархический = Истина И Струк.ВидИерархии
		= Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов);
КонецФункции

&НаСервереБезКонтекста
Функция вОписаниеТиповСтрока(ДлинаСтроки, ПеременнаяДлина = Истина)
	Возврат Новый ОписаниеТипов("Строка", , , , Новый КвалификаторыСтроки(ДлинаСтроки, ?(ПеременнаяДлина,
		ДопустимаяДлина.Переменная, ДопустимаяДлина.Фиксированная)));
КонецФункции

&НаСервереБезКонтекста
Функция вОписаниеТиповЧисло(ЧислоРазрядов, ЧислоРазрядовДробнойЧасти = 0)
	Возврат Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(ЧислоРазрядов, ЧислоРазрядовДробнойЧасти));
КонецФункции

&НаСервереБезКонтекста
Функция вОписаниеТиповКода(ТипКода, ДлинаКода, ДопустимаяДлинаКода)
	Возврат ?(Строка(ТипКода) = "Число", вОписаниеТиповЧисло(ДлинаКода), вОписаниеТиповСтрока(ДлинаКода, ?(Строка(
		ДопустимаяДлинаКода) = "Фиксированная", Ложь, Истина)));
КонецФункции

&НаСервереБезКонтекста
Функция вОписаниеТиповНомера(ТипНомера, ДлинаНомера)
	Возврат ?(Строка(ТипНомера) = "Число", вОписаниеТиповЧисло(ДлинаНомера), вОписаниеТиповСтрока(ДлинаНомера, Ложь));
КонецФункции

&НаСервереБезКонтекста
Функция вОписаниеТиповВладельца(КоллекцияМД)
	МассивТипов = Новый Массив;
	Для Каждого Элем Из КоллекцияМД Цикл
		ИмяТипа = Элем.ПолноеИмя();
		ИмяТипа = СтрЗаменить(ИмяТипа, ".", "Ссылка.");
		МассивТипов.Добавить(Тип(ИмяТипа));
	КонецЦикла;

	Возврат Новый ОписаниеТипов(МассивТипов);
КонецФункции

&НаСервере
Процедура вЗаполнитьСтандартныеРеквизиты(ОбъектМД)
	Перем НС;

	ПереченьРеквизитов = "Код, Номер, Дата, Проведен, ПометкаУдаления, ЭтоГруппа, Наименование, Владелец, Родитель, БизнесПроцесс, Выполнена, Завершен, Стартован, НомерОтправленного, НомерПринятого, ЭтотУзел, ИмяПредопределенныхДанных";
	ПереченьСвойств = "ТипКода, ТипНомера, ДлинаКода, ДопустимаяДлинаКода, ДлинаНомера, ДлинаНаименования, Иерархический, ВидИерархии, Владельцы";

	СтрукРеквизиты = Новый Структура(ПереченьРеквизитов);
	СтрукСвойства = Новый Структура(ПереченьСвойств);

	ЗаполнитьЗначенияСвойств(СтрукСвойства, ОбъектМД);
	ЗаполнитьЗначенияСвойств(СтрукРеквизиты, мОбъектСсылка);

	Если Метаданные.ПланыОбмена.Содержит(ОбъектМД) Тогда
		Если СтрукСвойства.ТипКода = Неопределено Тогда
			СтрукСвойства.ТипКода = "Строка";
		КонецЕсли;
	КонецЕсли;

	Если Метаданные.ПланыСчетов.Содержит(ОбъектМД) Тогда
		Если СтрукСвойства.ТипКода = Неопределено Тогда
			СтрукСвойства.ТипКода = "Строка";
		КонецЕсли;
	КонецЕсли;

	Если СтрукСвойства.ТипНомера <> Неопределено И ЗначениеЗаполнено(СтрукСвойства.ДлинаНомера) Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "Номер";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = вОписаниеТиповНомера(СтрукСвойства.ТипНомера, СтрукСвойства.ДлинаНомера);
		НС.Значение = СтрукРеквизиты.Номер;
	КонецЕсли;

	Если СтрукСвойства.ТипКода <> Неопределено И ЗначениеЗаполнено(СтрукСвойства.ДлинаКода) Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "Код";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = вОписаниеТиповКода(СтрукСвойства.ТипКода, СтрукСвойства.ДлинаКода,
			СтрукСвойства.ДопустимаяДлинаКода);
		НС.Значение = СтрукРеквизиты.Код;
	КонецЕсли;

	Если СтрукРеквизиты.Наименование <> Неопределено И ЗначениеЗаполнено(СтрукСвойства.ДлинаНаименования) Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "Наименование";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = вОписаниеТиповСтрока(СтрукСвойства.ДлинаНаименования);
		НС.Значение = СтрукРеквизиты.Наименование;
	КонецЕсли;

	Если СтрукРеквизиты.Дата <> Неопределено Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "Дата";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = Новый ОписаниеТипов("Дата", , , , , Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя));
		НС.Значение = СтрукРеквизиты.Дата;
	КонецЕсли;

	Если СтрукСвойства.Иерархический = Истина Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "Родитель";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		Массив = Новый Массив;
		Массив.Добавить(ТипЗнч(мОбъектСсылка));
		НС.ТипЗначения = Новый ОписаниеТипов(Массив);
		НС.Значение = СтрукРеквизиты.Родитель;
	КонецЕсли;

	Если СтрукРеквизиты.ПометкаУдаления <> Неопределено Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "ПометкаУдаления";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = Новый ОписаниеТипов("Булево");
		НС.Значение = СтрукРеквизиты.ПометкаУдаления;
	КонецЕсли;

	Если СтрукРеквизиты.ЭтоГруппа <> Неопределено И СтрукСвойства.Иерархический = Истина И СтрукСвойства.ВидИерархии
		= Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "ЭтоГруппа";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = Новый ОписаниеТипов("Булево");
		НС.Значение = СтрукРеквизиты.ЭтоГруппа;
	КонецЕсли;

	Если СтрукСвойства.Владельцы <> Неопределено И СтрукСвойства.Владельцы.Количество() <> 0 Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "Владелец";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = вОписаниеТиповВладельца(СтрукСвойства.Владельцы);
		НС.Значение = СтрукРеквизиты.Владелец;
	КонецЕсли;

	Если СтрукРеквизиты.ИмяПредопределенныхДанных <> Неопределено Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "ИмяПредопределенныхДанных";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = вОписаниеТиповСтрока(150);
		НС.Значение = СтрукРеквизиты.ИмяПредопределенныхДанных;
		
//		НС = РеквизитыОбъекта.Добавить();
//		НС.Имя = "Предопределенный";
//		НС.Представление = НС.Имя;
//		НС.Категория = 0;
//		НС.ТипЗначения = Новый ОписаниеТипов("Булево");
//		НС.Значение = СтрукРеквизиты.Предопределенный;
		
	КонецЕсли;

	Если Метаданные.Документы.Содержит(ОбъектМД) Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "Проведен";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = Новый ОписаниеТипов("Булево");
		НС.Значение = СтрукРеквизиты.Проведен;
	КонецЕсли;

	Если Метаданные.Задачи.Содержит(ОбъектМД) Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "БизнесПроцесс";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		Массив = Новый Массив;
		Массив.Добавить(ТипЗнч(СтрукРеквизиты.БизнесПроцесс));
		НС.ТипЗначения = Новый ОписаниеТипов(Массив);
		НС.Значение = СтрукРеквизиты.БизнесПроцесс;

		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "Выполнена";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = Новый ОписаниеТипов("Булево");
		НС.Значение = СтрукРеквизиты.Выполнена;
	КонецЕсли;

	Если Метаданные.БизнесПроцессы.Содержит(ОбъектМД) Тогда
		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "Стартован";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = Новый ОписаниеТипов("Булево");
		НС.Значение = СтрукРеквизиты.Стартован;

		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "Завершен";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = Новый ОписаниеТипов("Булево");
		НС.Значение = СтрукРеквизиты.Завершен;
	КонецЕсли;

	Если Метаданные.ПланыОбмена.Содержит(ОбъектМД) Тогда
		НС.Имя = "НомерОтправленного";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = Новый ОписаниеТипов("Число");
		НС.Значение = СтрукРеквизиты.НомерОтправленного;

		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "НомерПринятого";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = Новый ОписаниеТипов("Число");
		НС.Значение = СтрукРеквизиты.НомерПринятого;

		НС = РеквизитыОбъекта.Добавить();
		НС.Имя = "ЭтотУзел";
		НС.Представление = НС.Имя;
		НС.Категория = 0;
		НС.ТипЗначения = Новый ОписаниеТипов("Булево");
		НС.Значение = СтрукРеквизиты.ЭтотУзел;
	КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура вОбновитьДанныеОбъекта()
	Если мОбъектСсылка <> Неопределено Тогда
		Массив = Новый Массив;
		Массив.Добавить(ТипЗнч(мОбъектСсылка));
		Элементы.мОбъектСсылка.ОграничениеТипа = Новый ОписаниеТипов(Массив);
	КонецЕсли;

	НадоСоздаватьРеквизиты = (ТипЗнч(мОбъектСсылка) <> ТипЗнч(мОбъектСсылкаПредыдущий));

	Если _КонфигурацияДопускаетДопДвижения И НадоСоздаватьРеквизиты И ЗначениеЗаполнено(мОбъектСсылка) Тогда
		пСтрук = вОпределитьДополнительныеРегистрыДокумента(мОбъектСсылка);
		Элементы._ОткрытьРедакторДвиженийДоп.Видимость = пСтрук.ЕстьДанные;
	КонецЕсли;

	вОчиститьДанныеОбъекта();
	вЗаполнитьДанныеОбъекта(НадоСоздаватьРеквизиты);
	мОбъектСсылкаПредыдущий = мОбъектСсылка;
	вОбновитьНаборЗаписей();
	Если ЗначениеЗаполнено(мОбъектСсылка) Тогда
		УИ_ДатаСоздания = УИ_ОбщегоНазначения.ДатаСозданияСсылки(мОбъектСсылка);
	КонецЕсли;
КонецПроцедуры



&НаКлиенте
Процедура вПровестиДокументДалее(РезультатВопроса, ДопПараметры = Неопределено) Экспорт
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		пСтрук = Новый Структура;

//		Если _ИспользоватьДополнительныеСвойстваПриЗаписи И _ДополнительныеСвойства.Количество() <> 0 Тогда
//			пСтрук.ДополнительныеСвойства = Новый Структура;
//			Попытка
//				Для Каждого Стр Из _ДополнительныеСвойства Цикл
//					пСтрук.ДополнительныеСвойства.Вставить(Стр.Ключ, Стр.Значение);
//				КонецЦикла;
//			Исключение
//				Сообщить("Ошибка при установке ДополнительныхСвойств: неправильное значение ключа """ + Стр.Ключ + """");
//				Возврат;
//			КонецПопытки;
//		КонецЕсли;

//		Если _ИспользоватьПроцедуруПередЗаписью И Не ПустаяСтрока(_ПроцедураПередЗаписью) Тогда
//			пСтрук.ПроцедураПередЗаписью = _ПроцедураПередЗаписью;
//		КонецЕсли;

		Если вПровестиРаспровестиДокумент(мОбъектСсылка, Истина, пСтрук) Тогда
			ОбновитьДанныеОбъекта(Неопределено);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вРаспровестиДокументДалее(РезультатВопроса, ДопПараметры = Неопределено) Экспорт
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		Если вПровестиРаспровестиДокумент(мОбъектСсылка, Ложь) Тогда
			ОбновитьДанныеОбъекта(Неопределено);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция вПровестиРаспровестиДокумент(Ссылка, Провести = Истина, пСтрукПарам = Неопределено)
	Режим = ?(Провести, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.ОтменаПроведения);

	ДокОбъект = Ссылка.ПолучитьОбъект();

	Возврат УИ_ОбщегоНазначения.ЗаписатьОбъектВБазу(ДокОбъект, УИ_ОбщегоНазначенияКлиентСервер.ПараметрыЗаписиФормы(
		ЭтотОбъект), , Режим);

КонецФункции


// выгрузка / загрузка объекта через XML
&НаКлиенте
Функция вПолучитьДиалогВыбораФайлаXML(Открытие = Истина, ПутьКФайлу = "")
	Диалог = Новый ДиалогВыбораФайла(?(Открытие, РежимДиалогаВыбораФайла.Открытие, РежимДиалогаВыбораФайла.Сохранение));

	Диалог.ПолноеИмяФайла = ПутьКФайлу;
	Диалог.Заголовок  = "Файл данных XML";
	Диалог.Фильтр     = "Файлы данных XML (*.xml)|*.xml|Все файлы (*.*)|*.*";
	Диалог.Расширение = "xml";

	Возврат Диалог;
КонецФункции

&НаКлиенте
Процедура вЗагрузитьДанныеИзФайла(ВыбранныеФайлы, ДопПарам = Неопределено) Экспорт
	Если ВыбранныеФайлы <> Неопределено Тогда
		пИмяФайла = ВыбранныеФайлы[0];
		ТДок = Новый ТекстовыйДокумент;
		ТДок.НачатьЧтение(Новый ОписаниеОповещения("вПослеОкончанияЧтенияФайла", ЭтаФорма, ТДок), пИмяФайла, "UTF-8");
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вПослеОкончанияЧтенияФайла(ТДок) Экспорт
	Если ТипЗнч(ТДок) = Тип("ТекстовыйДокумент") Тогда
		СтрокаXML = ТДок.ПолучитьТекст();
		Если Не ПустаяСтрока(СтрокаXML) Тогда
			вЗагрузитьДанныеXML(СтрокаXML);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вВыгрузитьОбъект(пРежим)
	Если Не ЗначениеЗаполнено(мОбъектСсылка) Тогда
		ПоказатьПредупреждение( , "Не задан документ для выгрузки", 20);
		Возврат;
	КонецЕсли;

	Диалог = вПолучитьДиалогВыбораФайлаXML(Ложь);

	Если пРежим = 1 Тогда
		Диалог.ПолноеИмяФайла = "Объект";
	ИначеЕсли пРежим = 2 Тогда
		Диалог.ПолноеИмяФайла = "Объект (с движениями)";
	ИначеЕсли пРежим = 3 Тогда
		Диалог.ПолноеИмяФайла = "Объект (движения)";
	ИначеЕсли пРежим = 4 Тогда
		Диалог.ПолноеИмяФайла = _ИмяНабораЗаписей;
	КонецЕсли;

	Диалог.Показать(Новый ОписаниеОповещения("вВыгрузитьОбъектВФайл", ЭтаФорма, пРежим));
КонецПроцедуры

&НаКлиенте
Процедура вВыгрузитьОбъектВФайл(ВыбранныеФайлы, пРежим = Неопределено) Экспорт
	Если ВыбранныеФайлы <> Неопределено Тогда
		СтрокаXML = вСформироватьВыгрузкуXML(мОбъектСсылка, пРежим, _ИмяНабораЗаписей);
		Если Не ПустаяСтрока(СтрокаXML) Тогда
			пИмяФайла = ВыбранныеФайлы[0];
			ТДок = Новый ТекстовыйДокумент;
			ТДок.УстановитьТекст(СтрокаXML);
			ТДок.НачатьЗапись(Новый ОписаниеОповещения("вПослеОкончанияЗаписиФайла", ЭтаФорма), пИмяФайла, "UTF-8");
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура вПослеОкончанияЗаписиФайла(Результат, ДопПарам = Неопределено) Экспорт
	Если Результат = Истина Тогда
		ПоказатьПредупреждение( , "Данные выгружены в файл", 20);
	КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция вСформироватьВыгрузкуXML(Знач пСсылка, Знач пРежим, Знач пИмяНабораЗаписей = "")

	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку("UTF-8");

	ЗаписьXML.ЗаписатьОбъявлениеXML();
	ЗаписьXML.ЗаписатьНачалоЭлемента("_1CV8DtUD", "http://www.1c.ru/V8/1CV8DtUD/");
	ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("V8Exch", "http://www.1c.ru/V8/1CV8DtUD/");
	ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");
	ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("core", "http://v8.1c.ru/data");

	ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/8.1/data/enterprise/current-config");
	ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema");

	ЗаписьXML.ЗаписатьНачалоЭлемента("V8Exch:Data");
	Если пРежим = 4 Тогда
		Менеджер = вСоздатьМенеджерНабораЗаписей(пИмяНабораЗаписей);
		Если Менеджер <> Неопределено Тогда
			Набор = Менеджер.СоздатьНаборЗаписей();
			Набор.Отбор.Регистратор.Установить(пСсылка);
			Набор.Прочитать();

			СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Набор);
		КонецЕсли;
	Иначе
		Попытка
			пОбъект = пСсылка.ПолучитьОбъект();
		Исключение
			Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), СтатусСообщения.Важное);
			Сообщить("Выгрузка данных не выполнена!", СтатусСообщения.Важное);
			Возврат "";
		КонецПопытки;

		Если пРежим = 1 Или пРежим = 2 Тогда
			СериализаторXDTO.ЗаписатьXML(ЗаписьXML, пОбъект, НазначениеТипаXML.Явное);
		КонецЕсли;

		Если пРежим = 2 Или пРежим = 3 Тогда
			пОбъектМД = пОбъект.Метаданные();
			Если Метаданные.Документы.Содержит(пОбъектМД) Тогда
				Для Каждого Движение Из пОбъект.Движения Цикл
					Движение.Прочитать();
					СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Движение);
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	ЗаписьXML.ЗаписатьКонецЭлемента(); // V8Exc:Data
	ЗаписьXML.ЗаписатьКонецЭлемента(); // V8Exc:_1CV8DtUD

	СтрокаXML = ЗаписьXML.Закрыть();

	Возврат СтрокаXML;
КонецФункции

&НаСервереБезКонтекста
Процедура вЗагрузитьДанныеXML(Знач СтрокаXML)
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(СтрокаXML);

	Сообщить("Загрузка данных стартована");

	пОшибкаФормата = Ложь;
	пСтрокаНеверныйФормат = НСтр("ru = 'Неверный формат файла выгрузки'");

	Попытка
		// проверка формата
		Если пОшибкаФормата Или Не ЧтениеXML.Прочитать() Или ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента
			Или ЧтениеXML.ЛокальноеИмя <> "_1CV8DtUD" Или ЧтениеXML.URIПространстваИмен
			<> "http://www.1c.ru/V8/1CV8DtUD/" Тогда

			пОшибкаФормата = Истина;
		КонецЕсли;

		Если пОшибкаФормата Или Не ЧтениеXML.Прочитать() Или ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента
			Или ЧтениеXML.ЛокальноеИмя <> "Data" Тогда

			пОшибкаФормата = Истина;
		КонецЕсли;

		Если пОшибкаФормата Или Не ЧтениеXML.Прочитать() Тогда

			пОшибкаФормата = Истина;
		КонецЕсли;

	Исключение
		пОшибкаФормата = Истина;
	КонецПопытки;

	Если пОшибкаФормата Тогда
		Сообщить(пСтрокаНеверныйФормат, СтатусСообщения.Важное);
		ЧтениеXML.Закрыть();
		Возврат;
	КонецЕсли;
	
	
	// чтение данных
	НачатьТранзакцию();

	Пока СериализаторXDTO.ВозможностьЧтенияXML(ЧтениеXML) Цикл
		Попытка
			пОбъект = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
			пОбъект.ОбменДанными.Загрузка = Истина;
			пОбъект.Записать();
		Исключение
			пОшибкаФормата = Истина;
			Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), СтатусСообщения.Важное);
			Прервать;
		КонецПопытки;
	КонецЦикла;

	Если пОшибкаФормата Тогда
		ОтменитьТранзакцию();

		ЧтениеXML.Закрыть();
		Сообщить("Загрузка данных прервана", СтатусСообщения.Важное);
		Возврат;
	Иначе
		ЗафиксироватьТранзакцию();
	КонецЕсли;
	
	
	// проверка формата
	Если пОшибкаФормата Или ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента Или ЧтениеXML.ЛокальноеИмя <> "Data" Тогда

		пОшибкаФормата = Истина;
	КонецЕсли;

	Если пОшибкаФормата Или Не ЧтениеXML.Прочитать() Или ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента
		Или ЧтениеXML.ЛокальноеИмя <> "_1CV8DtUD" Или ЧтениеXML.URIПространстваИмен <> "http://www.1c.ru/V8/1CV8DtUD/" Тогда

		пОшибкаФормата = Истина;
	КонецЕсли;

	Если пОшибкаФормата Тогда
		Сообщить(пСтрокаНеверныйФормат, СтатусСообщения.Важное);
		ЧтениеXML.Закрыть();
		Сообщить("Загрузка данных завершена");
		Возврат;
	КонецЕсли;

	ЧтениеXML.Закрыть();
	Сообщить("Загрузка данных завершена");
КонецПроцедуры
&НаСервереБезКонтекста
Функция вОпределитьДополнительныеРегистрыДокумента(Знач пПолноеИмяДокумента)
	пСоотв = Новый Соответствие;

	пСтрук = Новый Структура;
	пСтрук.Вставить("ЕстьДанные", Ложь);
	пСтрук.Вставить("ДополнительныеРегистры", пСоотв);

	пРегистраторМД = Метаданные.Документы.Найти("РегистраторРасчетов");
	Если пРегистраторМД = Неопределено Тогда
		Возврат пСтрук;
	КонецЕсли;

	Если ТипЗнч(пПолноеИмяДокумента) <> Тип("Строка") Тогда
		пПолноеИмяДокумента = пПолноеИмяДокумента.Метаданные().ПолноеИмя();
		Если СтрНайти(пПолноеИмяДокумента, "Документ.") <> 1 Тогда
			Возврат пСтрук;
		КонецЕсли;
	КонецЕсли;

	Для Каждого ЭлемМД Из пРегистраторМД.Движения Цикл
		пРеквизитМД = ЭлемМД.Реквизиты.Найти("ДокументРегистратор");
		Если пРеквизитМД <> Неопределено Тогда
			пИмяРегистра = ЭлемМД.ПолноеИмя();

			Для Каждого пТип Из пРеквизитМД.Тип.Типы() Цикл
				пДокМД = Метаданные.НайтиПоТипу(пТип);

				Если пДокМД <> Неопределено Тогда
					пИмяДокумента = пДокМД.ПолноеИмя();

					Если пИмяДокумента = пПолноеИмяДокумента И пИмяДокумента <> "Документ.РегистраторРасчетов" Тогда
						пСоотв[пИмяРегистра] = ЭлемМД.Представление();
						Прервать;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;

	пСтрук.ЕстьДанные = (пСоотв.Количество() <> 0);

	Возврат пСтрук;
КонецФункции
&НаКлиенте
Процедура вОбработатьВвод_UUID(Строка, пСтрук = Неопределено) Экспорт
	Если Строка <> Неопределено И Не ПустаяСтрока(Строка) Тогда
		Попытка
			пЗначение = Новый УникальныйИдентификатор(Строка);
			мПоследнийUUID = Строка;
		Исключение
			ПоказатьПредупреждение( , "Значение не может быть преобразовано в Уникальный идентификатор!", 20);
			Возврат;
		КонецПопытки;

		Если пСтрук.Таблица = "_ЗначениеДляЗаполнения" Тогда
			_ЗначениеДляЗаполнения = пЗначение;
		Иначе
			ТекДанные = Элементы[пСтрук.Таблица].ТекущиеДанные;
			Если ТекДанные <> Неопределено Тогда
				ТекДанные[пСтрук.Поле] = пЗначение;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

// Заголовок страницы табличной части.
// 
// Параметры:
//  ИмяТЧ - Строка - 
//  ТаблицаТЧ - ТаблицаЗначений -
// 
// Возвращаемое значение:
//  Строка
&НаКлиентеНаСервереБезКонтекста
Функция ЗаголовокСтраницыТабличнойЧасти(ИмяТЧ, ТаблицаТЧ)
	Если ТаблицаТЧ.Количество() =0 Тогда
		Возврат ИмяТЧ;
	Иначе
		Возврат ИмяТЧ + " ("+ТаблицаТЧ.Количество()+")";
	КонецЕсли;			
КонецФункции

&НаКлиенте
Процедура ОбновитьЗаголовокСтраницыТабличнойЧасти(ЭлементТабличнойЧасти)
	Если Не СтрНачинаетсяС(ЭлементТабличнойЧасти.Имя, _ПрефиксДляНовыхЭлементов) Тогда
		Возврат;
	КонецЕсли;

	ИмяТаблицы = Сред(ЭлементТабличнойЧасти.Имя, СтрДлина(_ПрефиксДляНовыхЭлементов) + 1);
	Элементы["Стр" + ЭлементТабличнойЧасти.Имя].Заголовок = ЗаголовокСтраницыТабличнойЧасти(ИмяТаблицы,
		ЭтотОбъект[ЭлементТабличнойЧасти.Имя]);

КонецПроцедуры


#КонецОбласти



